Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的大素数_C_Windows_Primes - Fatal编程技术网

c语言中的大素数

c语言中的大素数,c,windows,primes,C,Windows,Primes,我正在做Eular问题页面中的另一个问题。 低于10的素数之和为2+3+5+7=17。 求200万以下所有素数之和 我已经成功地编写了下面的代码,但我认为在某些方面(即当我们得到大素数时),代码会失去准确性。答案应该是142913828922,但我得到1179908154 我不知道为什么我没有得到答案,因为下面的代码适用于10岁以下的儿童 任何帮助都会很好。我做这些问题的原因是为了在C上取得更好的成绩 代码: #包括 #包括 #包括 /*初始化*/ 无效计算编号(无符号长编号); int isP

我正在做Eular问题页面中的另一个问题。 低于10的素数之和为2+3+5+7=17。 求200万以下所有素数之和

我已经成功地编写了下面的代码,但我认为在某些方面(即当我们得到大素数时),代码会失去准确性。答案应该是142913828922,但我得到1179908154

我不知道为什么我没有得到答案,因为下面的代码适用于10岁以下的儿童

任何帮助都会很好。我做这些问题的原因是为了在C上取得更好的成绩

代码:

#包括
#包括
#包括
/*初始化*/
无效计算编号(无符号长编号);
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;
        }
    }