[英]Big Prime Numbers in c
我在Eular问题页面上做了另一个问题。 小于10的素数之和为2 + 3 + 5 + 7 =17。找到小于200万的所有素数之和。
我设法在下面编写了代码,但是我认为代码的某些地方(即当我们得到大质数时)失去了准确性。 答案应该是142913828922,但我却得到1179908154。
我不知道为什么我没有得到答案,因为下面的代码适用于10岁以下。
任何帮助都会很棒。 我做这些问题的原因是要在C方面变得更好。
码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* Initialise */
void CalcNumber(unsigned long number);
int isPrime(unsigned long number);
/* Functions*/
void CalcNumber(unsigned long number)
{
unsigned long i = 1;
unsigned long prime = 0;
while(i != number)
{
i++;
if(isPrime(i))
{
printf("prime: %lu\n", i);
prime += i;
}
}
printf("The sum of primes under %lu: %lu\n",number, prime);
printf("count: %d\n", i);
}
int isPrime(unsigned long number)
{
int i, nb, count, test,limit;
test = count = 0;
nb = number;
limit = sqrt(nb) + 1;
if(nb == 2)
{
return 1;
}
if (nb % 2 == 0)
test = 1;
else{
for (i = 3 ; i < limit && ! test; i+=2, count++)
if (nb % i == 0)
test = 1;
}
if (!test)
return 1;
else
return 0;
}
int main(void)
{
unsigned long number;
printf("Enter a number: \n");
scanf("%ul", &number );
CalcNumber(number);
return EXIT_SUCCESS;
}
考虑到数字的长度,您应该使用至少64位长的数据类型。 较新的C99标准包括至少64位的long long
(和unsigned long long
)数据类型。 如果你需要printf
他们,你必须使用"%lld"
和"%llu"
。
void CalcNumber(unsigned long number)
{
unsigned long i = 1;
unsigned long prime = 0;
while(i != number)
{
i++;
if(isPrime(i))
{
printf("prime: %lu\n", i);
prime += i;
}
}
请注意,您要检查的数字大约是所需数量的两倍。 唯一的偶质数是2
,因此除了大于或等于3
奇数之外,没有其他任何检查要点-并“手动”添加1+2
。 您不妨使用i += 2;
这里。
您的isPrime()
方法将重新计算很多信息。 PE是什么在真正得到使用的是埃拉托色尼的筛建立素数表,然后从求和的素数。
但是,如果您真的想继续使用当前的isPrime()
方法,我想给您一个非常强烈的提示,即您完全放弃了test
变量,并在知道数字不是素数时立即从该方法return
。 这将导致代码更易于阅读和调试。
考虑编写一些专门测试isPrime()
测试用例。 检查通常的嫌疑犯:1、2、3、4、5、7、8、9、15、16、17等。
您存储质数总和的变量为无符号长,无符号长范围为0到4294967295。它不能容纳142913828922数字。 142913828922 mod(4294967295 +1)= 1179908154
更改您的数据类型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.