Почему код продолжает работать бесконечно после определенного количества итераций? - PullRequest
1 голос
/ 01 мая 2019

Пожалуйста, рассмотрите этот код C

void main() {
    int i, s = 17;
    for (i = 8; i < 2000000; i++) {
        if (ifprime(i))
            s += i;
    }
    printf("%d", s);
}

Он не будет работать с таким количеством итераций, но даст некоторый результат с меньшими итерациями, такими как while (i < 200000)

Почему это?

(обратите внимание, что я не прошу решения, большое спасибо)

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Это будет переполнено 32-битными целыми числами. Это неопределенное поведение, и хотя обычно это не приводит к тому, что ваша программа работает бесконечно, это возможно, потому что нет никакой гарантии того, что происходит, когда ваша программа демонстрирует неопределенное поведение. Вместо этого попробуйте long long, что не менее 64 бит (для подписанной версии это не менее 63 бит и один знаковый бит).

long long s = 17;

И напечатать это так:

printf("%lld", s);

Эта неоптимизированная версия поиска простых чисел займет много времени для всех чисел, вплоть до 2000000, поэтому, возможно, вы просто думаете, что он работает бесконечно, когда это не так. Я рекомендую отладку, поместив отпечаток типа if (i % 1000 == 0) printf("%d %lld\n", i, s); в цикл, тогда вы сможете увидеть, как далеко он продвигается и работает ли он до сих пор. Для меня это работает (с этим исправлением long long, конечно).

1 голос
/ 01 мая 2019

потому что вы знаете, что будет положительным, вы можете использовать

unsigned long long s = 17;

, а затем распечатайте его с

printf("%llu",s);

также вы можете использовать это для I

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...