C 试图找到素数
我是一所编程大学的一年级学生,我的第一项任务是求3990000000到401000000之间的素数之和。问题是我所做的每件事,当我运行程序时,它说总和是0,返回值是25。我一直试图调试这段代码,但运气不好,有人能帮我吗 我的代码是: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
#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。