我是一所编程大学的大一学生,我的第一个任务是找到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);
}
答案 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;