试图找到素数

时间:2018-11-12 14:21:04

标签: c

我是一所编程大学的大一学生,我的第一个任务是找到3990000000至4010000000之间的质数之和。问题是我所做的一切,当我运行该程序时说总和为0,返回值为25。我一直在尝试调试此代码,但没有运气,有人可以帮助我吗?

我的代码是:

#include <stdio.h>
#define STARTNUMBER 3990000000 
#define ENDNUMBER 4010000000

int main() {
  unsigned int num;
  int j, c, flag, sum = 0;
  flag = 1;
  c = 5;
  j = 7;
  for (num = STARTNUMBER; num <= ENDNUMBER; num++) {
    if (num % 2 == 0) { /*if number mod 2 equals zero go to next number*/
      flag = 0;
      break;
    }
    if (num % 3 == 0) { /*if number mod 3 equals zero go to next number*/
      flag = 0;
      break;
    } else
      /*check if number is prime with the sequences 5+6+6...<=sqrt(number) and 7+6+6..<=sqrt(number)*/
      while (c * c <= num && j * j <= num && flag == 1) { 
        if (num % c == 0 || num % j == 0) {
          flag = 0;
          break;
        }
        c += 6;
        j += 6;
      }
    if (flag == 1)
      sum++;
  }
  printf("There are %d prime numbers", sum);
}

1 个答案:

答案 0 :(得分:0)

即使您的代码只是打印出多少个素数,您仍要求素数的总和。假设您对练习有误解,我尝试说明您最初提出的问题的可能,因为间隔非常接近2 32 。因此,您会在练习中发现一个可能的技巧。

假设您还在64位环境中,如果该整数中至少有两个质数,则总和将大于INT_MAX(2 31 - 1)。 int不足以存储值,unsigned int也不足,因为UINT_MAX为2 32 -1。

最后,假设您已经使用注释中已经描述的break语句解决了问题,请尝试将sum变量存储到unsigned long int中,并替换其中的最后一部分

if (flag==1)
    sum += num;