"Нам не нужно перечислять фракции в каком-либо конкретном порядке, нам просто нужно убедиться, что до тех пор, пока цикл продолжится, каждое рациональное число в конечном итоге будет построено. Так что же:
for i=0 to infinity
for j=1 to i
display i/j
next j
next i
Вы должны уметь видеть, что если вы подождете достаточно долго, каждая фракция будет в конечном итоге отображена. Фактически мы генерируем каждую фракцию бесконечно много раз из-за одинаковых членов, таких как 1/2, 2/4. 4/8 и т. Д.. "
Почему выход 1/2, 2/4 и так далее...? Я не могу понять: ((Переведите этот псевдокод на язык C или C++, возможно, я не прав:
#include <stdio.h>
int main()
{
for (int i = 0; i < 100000000000000000; i++) {
for(int j = 1; j < i; j++) {
printf("%f\n", (float)(i/j));
}
}
return 0;
}
Я предполагаю, что вы ссылаетесь на это предложение:
Фактически мы генерируем каждую фракцию бесконечно много раз из-за одинаковых членов, таких как 1/2, 2/4. 4/8 и т. Д.. "
Это НЕ говорит, что выход равен 1/2, 2/4, 4/8. Он просто говорит, что любая конкретная дробь, например, 1/2, появляется на выходе бесконечно много раз. Ie 1/2 == 2/4 == 4/8 ==... и так далее.
i/j
возвращает целочисленный результат (который затем вы бросаете в float
).
+ Изменить
(float)(i/j)
в
((float)i)/j
Кроме того, в зависимости от диапазона типа int
на вашей платформе, 100000000000000000
, вероятно, будет слишком большим, чтобы соответствовать int
.
Why the output is 1/2, 2/4 and so on... ? I can't figure out :((
- Даже я не могу, вы никогда не получите такой вывод в C с кодом выше, я не думаю, что этот вопрос полностью ясен.