C 试图找到素数

C 试图找到素数,c,C,我是一所编程大学的一年级学生,我的第一项任务是求3990000000到401000000之间的素数之和。问题是我所做的每件事,当我运行程序时,它说总和是0,返回值是25。我一直试图调试这段代码,但运气不好,有人能帮我吗 我的代码是: #include <stdio.h> #define STARTNUMBER 3990000000 #define ENDNUMBER 4010000000 int main() { unsigned int num; int j, c, f

我是一所编程大学的一年级学生,我的第一项任务是求3990000000到401000000之间的素数之和。问题是我所做的每件事,当我运行程序时,它说总和是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);
}
#包括
#定义起始编号3990000000
#定义端号4010000000
int main(){
无符号整数;
int j,c,flag,sum=0;
flag=1;
c=5;
j=7;

对于(num=STARTNUMBER;num您正在询问素数的和,即使您的代码只是打印它们的数量。假设您误解了这个练习,我尝试展示您原始问题的一个可能问题,在您的练习中瞥见一个可能的技巧,因为间隔非常接近232

假设您也在64位环境中,如果该区间中至少有两个素数,则总和将大于
INT\u MAX
(231-1)。一个
INT
不足以存储值,而且
无符号INT
也不够,因为
UINT\u MAX
是232-1

最后,假设您已经解决了注释中已经描述的
break
语句的问题,尝试将
sum
变量存储到
无符号长整数中,并用

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

在第一次迭代中,你将
break
从循环中分离出来。你是在寻找素数的总和(如你所说的),还是仅仅寻找素数的数目(如你在代码中所做的)?就像@tkausl已经说过的,你需要重温for循环的主题,以及
break
指令是如何准确地为循环工作的“返回值25”,是由
printf
打印的字符数(顺便说一句,末尾缺少换行符),因为您的
main
缺少自己的
return
语句。一旦您修复了
break
ing逻辑,您将看到必须为每个新的
num
重置
flag
c
j
的值。现在,您只需在开始时设置这些值一次。是的,我的错误,说到数字之和,我的意思是在startnumber和endnumber之间有多少个数字,因此将sum变量存储到unsigned int中就足够了。至于break命令的使用,如果break所在的命令(在本例中是if命令)为false,循环是否会停止并继续到下一个数字?(flag=0)。我已尝试删除break命令并将其保留为flag命令,但没有任何帮助。您应该将其称为“count”而不是“sum”。变量名很重要—您和其他人可能必须在几年后阅读代码,并且可能会合理地(错误地)假定“sum”是一个sum。