c语言中的大素数
我正在做Eular问题页面中的另一个问题。 低于10的素数之和为2+3+5+7=17。 求200万以下所有素数之和 我已经成功地编写了下面的代码,但我认为在某些方面(即当我们得到大素数时),代码会失去准确性。答案应该是142913828922,但我得到1179908154 我不知道为什么我没有得到答案,因为下面的代码适用于10岁以下的儿童 任何帮助都会很好。我做这些问题的原因是为了在C上取得更好的成绩 代码:c语言中的大素数,c,windows,primes,C,Windows,Primes,我正在做Eular问题页面中的另一个问题。 低于10的素数之和为2+3+5+7=17。 求200万以下所有素数之和 我已经成功地编写了下面的代码,但我认为在某些方面(即当我们得到大素数时),代码会失去准确性。答案应该是142913828922,但我得到1179908154 我不知道为什么我没有得到答案,因为下面的代码适用于10岁以下的儿童 任何帮助都会很好。我做这些问题的原因是为了在C上取得更好的成绩 代码: #包括 #包括 #包括 /*初始化*/ 无效计算编号(无符号长编号); int isP
#包括
#包括
#包括
/*初始化*/
无效计算编号(无符号长编号);
int isPrime(无符号长数字);
/*功能*/
无效计算编号(无符号长编号)
{
无符号长i=1;
无符号长素数=0;
while(i!=数字)
{
i++;
如果(i)
{
printf(“质数:%lu\n”,i);
素数+=i;
}
}
printf(“在%lu下的素数之和:%lu\n”,数字,素数);
printf(“计数:%d\n”,i);
}
int isPrime(无符号长数字)
{
int i、nb、计数、测试、限值;
测试=计数=0;
nb=数量;
限值=sqrt(nb)+1;
如果(nb==2)
{
返回1;
}
如果(注意%2==0)
测试=1;
否则{
对于(i=3;i
请注意,您检查的数字大约是所需数字的两倍。唯一的偶数素数是2
,因此除了奇数大于或等于3
——并“手动”添加1+2
,没有任何检查点。您不妨使用i+=2代码>这里
您的isPrime()
方法将重新计算大量信息。PE真正要做的是用这个函数建立一个素数表,然后对素数求和
但是如果您真的想继续使用当前的isPrime()
方法,我想给出一个非常强烈的提示,当您知道一个数字不是素数时,您可以完全删除test
变量,并立即从该方法返回。这将导致代码更易于阅读和调试
考虑编写一些专门测试isPrime()
的测试用例。检查常见的嫌疑犯:1、2、3、4、5、7、8、9、15、16、17等
请注意,您检查的数字大约是所需数字的两倍。唯一的偶数素数是2
,因此除了奇数大于或等于3
——并“手动”添加1+2
,没有任何检查点。您不妨使用i+=2代码>这里
您的isPrime()
方法将重新计算大量信息。PE真正要做的是用这个函数建立一个素数表,然后对素数求和
但是如果您真的想继续使用当前的isPrime()
方法,我想给出一个非常强烈的提示,当您知道一个数字不是素数时,您可以完全删除test
变量,并立即从该方法返回。这将导致代码更易于阅读和调试
考虑编写一些专门测试isPrime()
的测试用例。检查常见的可疑项:1、2、3、4、5、7、8、9、15、16、17等。考虑到数字的长度,您应该使用长度至少为64位的数据类型。较新的C99标准包括至少64位的long
(和unsigned long
)数据类型。如果需要printf
它们,则必须使用%lld”
和%llu”
考虑到数字的长度,应使用长度至少为64位的数据类型。较新的C99标准包括至少64位的long
(和unsigned long
)数据类型。如果需要printf
它们,则必须使用%lld”
和%llu”
存储素数和的变量为无符号长,无符号长范围为0到4294967295。它不能容纳142913828922号码。
142913828922模(4294967295+1)=11790908154
更改数据类型存储素数和的变量为无符号长,无符号长范围为0到4294967295。它不能容纳142913828922号码。
142913828922模(4294967295+1)=11790908154
更改您的数据类型计算机上的无符号长字符的大小是多少?如果你想让它工作,答案应该是64。@spartan2417你的长是多少?:-)我不是在开玩笑。在Windows下仍然是32位,所以不够长。请尝试使用无符号long long int;)是的,如果unsigned long long
不起作用,请尝试uint64\u t
或unsigned\u int64
(取决于您的编译器)。@Constantinius:我不同意codereview
;他们的常见问题包括一行,你的计算机上未签名长字符的大小是多少?如果你想让它工作,答案应该是64。@spartan2417你的长是多少?:-)我不是在开玩笑。在Windows下仍然是32位,所以不够长。请尝试使用无符号long long int;)是的,如果unsigned long long
不起作用,请尝试uint64\u t
或unsigned\u int64
(取决于您的编译器)。@Constantinius:我不同意codereview
;他们的常见问题包括:,
#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;
}
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;
}
}