код не работает с большими числами, такими как long d = 9999999999;
Это связано с двумя причинами: недостаточный диапазон должен long
быть 32-битным и long*long
переполнение.
Чтобы работать со значениями, такими как 9,999,999,999
(34-битное значение), обязательно используйте 34+-битную математику.Предложите unsigned long long
, который по крайней мере 64-битный.
Избегайте теста num >= i * i
, так как i*i
может легко переполниться.Используйте num/i >= i
. 1
Вместо:
int is_prime(unsigned long long num) {
if (num <= 1) return 0;// Handle 0,1
unsigned long long i = 2;
for (i; num/i >= i; i++) {
if (num % i == 0) {
return 0;
}
}
return 1;
}
Существует много улучшений производительности, возможно с простым определением,Тем не менее, это должно привести к тому, что код «не работает с большими числами».
1 Хорошие компиляторы будут видеть ближайшие num/i
и num%i
и часто их вычислятьвместе примерно столько же времени, сколько один.