Я пытался написать программу для нахождения наибольшего простого множителя числа 600851475143 и столкнулся с некоторыми трудностями при запуске программы, показанной ниже.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long long n = 600851475143;
long long largest = 0;
int prime(long long c);
int main()
{
for (long long i = 0; i < n; i++)
{
if (n % i == 0 && prime(i) == 0)
{
largest = i;
}
}
printf("%ll\n", largest);
return 0;
}
int prime(long long c)
{
for (long long j = 0; j < c; j++)
{
if (c % j == 0)
{
return 1;
}
}
return 0;
}
Программа компилируется без каких-либо ошибок или предупреждений, но когда я запускаю программу, кажется, что она работает в течение нескольких секунд, но затем завершается, ничего не выводя, даже несмотря на то, что в конце main есть оператор printf. Я в Windows использую MinGW и gcc, если это поможет.
Каков статус выхода программы? т.е. что говорит ваша оболочка, если вы вызываете «echo $?» в окне оболочки MinGW?
Прочтите как отлаживать небольшие программы и про тест на простоту
Разве вы не получаете исключение «деление на ноль» в prime() из-за: for (long long j = 0; j < c; j++) { if (c % j == 0) На первой итерации j равен 0, поэтому вы делите на 0, а целочисленное деление на ноль определенно является Плохой Вещью™. Вы должны начинать цикл с 2, а не с 0. Даже если у вас не возникает проблем с делением на ноль, вы также пытаетесь разделить на 1, и каждое целое число, кроме 0, оставляет нулевой остаток при делении на 1. Однако отсутствие результата настоятельно указывает на ошибку деления на ноль.
Ваш код скомпилирован, но когда я его запустил, я получил «Исключение с плавающей запятой». Вы должны где-то делить на 0.
Попробуйте начать цикл for с 2! Алгоритмы, которые вы используете, не самые лучшие из возможных. Вы можете настроить prime, учитывая, что, кроме 2, делители нечетные, и, кроме того, поиск делителя может быть предпринят до квадратного корня из n... (просто для начала иметь более мощный код).
Код ничего не отображает, потому что он завершается из-за деления на 0!
Спасибо, с улучшением производительности функции простого числа и отсутствием деления на 0 программа работает так, как предполагалось.





Вы должны подумать о делении на простые множители по мере их нахождения (неоднократно, если число имеет один и тот же простой множитель несколько раз (как в
9имеет3в качестве множителя, дважды). Это уменьшает количество необходимых тестов. Есть много простых шагов, которые вы можете предпринять, чтобы значительно улучшить производительность функцииprime(), начиная с использования условияj * j <= cвместоj < c.