繁体   English   中英

c中的大素数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM