C 寻找素数并添加它们的有效算法?
对于ProjectEulerProblem 10,我们应该添加所有素数,但这需要我的计算机数年才能完成。需要一个更高效的算法! 这是我目前的C代码:C 寻找素数并添加它们的有效算法?,c,algorithm,C,Algorithm,对于ProjectEulerProblem 10,我们应该添加所有素数,但这需要我的计算机数年才能完成。需要一个更高效的算法! 这是我目前的C代码: #include <stdio.h> int main(void) { int i, j, flag, sum=0; for(i=3; i< 2000000; i = i + 2) { flag=0; for(j=3; j<=i/2; j = j + 2) { if(i%j==0) {
#include <stdio.h>
int main(void)
{
int i, j, flag, sum=0;
for(i=3; i< 2000000; i = i + 2)
{
flag=0;
for(j=3; j<=i/2; j = j + 2)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
sum += i;
}
printf ("%i", sum + 2);
}
#包括
内部主(空)
{
int i,j,flag,sum=0;
对于(i=3;i<2000000;i=i+2)
{
flag=0;
对于(j=3;j,在保持相同的素性测试算法的同时,这里对您的过程进行了一点改进:
- 将
sum
变量设置为前两个素数的和(即2+3=5)
- 从5开始,只测试与6的倍数相邻的数字
- 对于每个数字,仅使用与6的倍数相邻的除数进行测试
- 对于每个数字,仅使用5和数字平方根之间的除数进行测试
请注意,此实现提高了算法的性能,但没有提高算法的时间复杂度,并且有更有效的方法来测试素性
inti,j,iplus,jplus,flag,iroot,sum=2+3;
intiroot=(int)ceil(sqrt((float)5));
int square=iroot*iroot;
对于(i=5,iplus=2;iHint:。其他人:请不要回答这个问题。这是一个很容易回答的问题,但Euler项目的目的是学习一些东西。如果你想提供一个实际的答案,请按照Euler项目的精神来做,并将OP指向正确的方向,不要用代码(更改)来回答他。请参阅上面的评论。作为旁注,您只需检查平方根以下的可能因子,因为复合数的至少一个因子将小于或等于平方根。@LasseV.Karlsen同意,相关讨论将需要更多帮助,如何使用它???尽管它的功能对于10以下的素数是正确的,但是,如果低于200万,输出是错误的。@TooTone和#LasseV.karlse如果你想用它运行,直到它得出合乎逻辑的结论,请尝试。
int i, j, iplus, jplus, flag, iroot, sum = 2+3;
int iroot = (int)ceil(sqrt((float)5));
int square = iroot*iroot;
for (i=5, iplus=2; i<2000000; i+=iplus, iplus=4-iplus)
{
flag = 0;
if (square < i)
{
iroot++;
square = iroot*iroot;
// instead of calculating the square root of the number every time,
// calculate it at the beginning, and increment it only when needed
}
for (j=5, jplus=2; j<=iroot; j+=jplus, jplus=4-jplus)
{
if (i%j == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
sum += i;
}
printf("%i", sum);