我一直在尝试重新编码,尤其是在C语言中。因此,我已经使用Project Euler提出了项目构想,并采用了关于10001st prime的构想。但是,当我运行下面的代码时,它返回2、0、0、0等。这是什么问题?我已经看过其他人提出的问题,但是没有找到像C这样低级的语言。
/*##########################################################
* The 10,001st Prime
* Rob Merrell
* 21 January 2016
##########################################################*/
#include <stdio.h>
#include <math.h>
int main() {
int Int = 2; int PrimeCheck = 2; int Count = 0; int PrimeCount = 0;
int Primes[10002]; Primes[0] = 0;
if (Int < PrimeCheck) {
for (Int = 2; Int < PrimeCheck;PrimeCount < 10001) {
if (PrimeCheck%Int != 0) {
Int++;
continue;
}
else {
PrimeCheck++;
Int = 2;
continue;
}
}
}
else {
Count++;
Primes[Count] = PrimeCheck;
PrimeCount++; PrimeCheck++;
Int = 2;
}
int i = 1;
for(i = 1; i < 10001; i++) {
printf("%d ", Primes[i]);
}
return 0;
}
最佳答案
您的问题更多是关于解决问题,然后再用C(或任何其他语言)进行编程,因为您的解决问题的方法有很多评论中提到的错误。这是考虑此问题的一种方法:
因此,如果我要您手动解决此问题,您将如何处理?
您很可能会执行以下操作:
(步骤1)选择一个注视测试编号,例如4(知道2和3是质数)
(第2步)将试验除数设置为2
(第3步)如果您的电话号码可以被审判除数平均除尽,请转到第7步
(第4步)将琐碎的除数增加1和第3步。
(第5步)写下下一个数字,因为它是素数,
(第6步)检查是否找到了10001个素数,如果是,则结束。
(第7步)将测试编号加1,然后转到第2步
因此,在伪代码中,以上内容将类似于以下内容:
primeCnt <- 2
testNum <- 4
while (primeCnt <= 10001) do
divisor <- 2
isComposite <- false
while (divisor < testNum)
if(testNum % divisor == 0) // we found a factor
isComposite <- true
break
end if
divisor <- divisor + 1
done
if (!isComposite) // we found a prime
primeCnt <- primeCnt + 1
print testNum
end if
testNum <- testNum + 1
done
您应该能够将上面的伪代码转换为C。显然,上面的代码没有经过优化。
我从欧拉7号项目中学到的一些知识-
如果希望遇到大量数字,建议您使用无符号64位整数以避免整数溢出。
上面的算法虽然正确,但效率不是很高,并且将需要很长时间才能运行。您可能希望使用它来查找前20个左右的素数,以验证它是否有效(然后寻找优化)。
当我解决它时,我使用了质数等于或小于六或大于六的倍数(不包括2和3)的事实。有关此陈述的证明,请参见this link。
关于c - 为什么我的质数生成函数生成一堆零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34937915/