【发布时间】:2014-04-04 21:32:41
【问题描述】:
这是我的 C 代码,用于解决 project-Euler 中的问题#3,我必须在其中找到 600851475143 的最大素数。
#include <stdio.h>
#include <stdlib.h>
bool is_prime(long int number){
long int j;
for (j=2; j<=number/2; j++){
if (number%j==0) return false;
if (j==number/2) return true;
}
}
int main(){
long int input;
scanf("%d", &input);
long int factor;
int ans=0;
for (factor=input/2; factor>1; factor--){
if (input%factor==0 && is_prime(factor)) {
ans = factor;
break;
}
}
printf("%d\n", ans);
system("pause");
return 0;
}
虽然它适用于小数字,但逐渐它需要越来越多的时间才能给出答案。最后,对于 600851475143,代码返回 0,这显然是错误的。 有人可以帮忙吗? 非常感谢。
【问题讨论】:
-
你可能不知道,但这实际上是C++。
-
这可能取决于您的平台以及它如何定义
int,但请查看INT_MAX以了解为什么您可能会遇到将600851475143作为您的测试值的问题。特别是,更仔细地查看scanf()中的格式说明符。编译所有和额外的警告 (-Wall -Wextra) 以查看是否收到有关溢出的警告。 -
网上有很多很多关于如何快速生成素数的文章;我会先阅读它们。
-
你能做的最显着的改进是只测试到数字的 sqrt。从 sqrt(n) 而不是 input/2 开始。
-
@EricLippert 这个问题的最快解决方案不涉及生成素数。 (参见例如stackoverflow.com/questions/15279278/…)。
标签: c performance algorithm primes