Простое изменение покажет вам, насколько быстро ваша программа работает и сколько работы она должна сделать. Ваш статус легко распечатать примерно через каждые 100 итераций. (Или вы можете установить его на 1000 или 10000 итераций.)
Помните, что вы можете УДВОИТЬ скорость вашего цикла за IsPrime
.
После того, как вы отметите 2, вам нужно только проверить нечетные числа, и вы можете продвигаться с i+=2
вместо i++
.
Если вас беспокоит скорость, почему вы тратите столько времени на проверку четных чисел? (обратите внимание, что как только вы начнете использовать только нечетные числа, вам также нужно будет изменить выходной тест, чтобы он был нечетным числом)
Вы также можете УДВОИТЬ скорость цикла в main
, также избегая там четных чисел. (опять же, вам нужно использовать частный случай 2, затем использовать i + = 2, начиная с 3, чтобы получить 3, 5, 7, 9 ....)
Если цикл в IsPrime
выполняется вдвое быстрее, а цикл в main
- в два раза быстрее, это должно ускорить выполнение вашей программы в 4 раза. (если бы раньше это занимало час, теперь это будет 15 минут.)
Другое большое улучшение скорости, которое вы могли бы сделать, - это запустить цикл только до sqrt(num)
, а не до num
.
Поскольку я ненавижу использовать функции с плавающей запятой, такие как sqrt
, я вместо этого предлагаю близкое приближение, которое остановится в пределах 100 итераций прохождения границы sqrt, а также регулярно показываю обновления статуса.
if (num%2 == 0)
{
flag=0;
return flag;
}
/* Now that we checked 2, we only need to check odd numbers from now on. */
for(i=3;i<num;i+=2)
{
if (i%101 == 0)
{
printf("i is %d out of %d\n", i, num);
if (i*i > num)
{
break; /* If you pass the sqrt boundary, quit. */
}
}
if(num%i==0)
{
flag=0;
break;
}
}
P.S. Я поместил этот код в проект на C # (незначительное портирование). Конечно, теперь это работало на 64-битной ОС с улучшенным компилятором и процессором с тактовой частотой 2,8 ГГц.
Он работал менее чем за 20 секунд.
person
abelenky
schedule
04.10.2010
BigInt
для хранения результата, а не переполнения. Вы также можете написать '.' каждый 10-й раз вы находите простое число, но не забудьте перенаправить его в файл, чтобы поддерживать приличную скорость. Затем посмотрите размер / содержание файла отдельно. Возможно, вы захотите ускорить проверку на простоту, посмотрев только на sqrt (N). - person Hamish Grubijan   schedule 04.10.2010int
для флага вместоbool
? - person vol7ron   schedule 04.10.2010bool
. (В C99 есть _Bool, но это уже другая история ..) - person Billy ONeal   schedule 04.10.2010O(n^2)
он более точен для времени от 1999901 до 2000000, а затем умножьте его на 0,5 * (2000000/100), чтобы получить оценку. - person rwong   schedule 04.10.2010int
,unsigned
иlong
использовались в одном объявлении! - person Gabe   schedule 04.10.2010Turbo C++
Я предположилc++
. Кто-нибудь еще программирует наc
?C++
становится еще менее вероятным, посколькуC#
повсюду. - person vol7ron   schedule 04.10.2010unsigned long
. - person Gabe   schedule 05.10.2010long int
. - person Gabe   schedule 05.10.2010