请问我用这个程序求100以内的素数,为什么得不到正确的结果呢?请问哪里出问题了?
#include<stdio.h>
#include<math.h>
int main(void){
int i,j;
int ret=0;
for(i=2;i<=100;i++){
int a=sqrt(i);
for(j=2;j<a;j=j+1){
if(i%j==0){
ret++;
break;
}
}
if(ret==0){
printf("%5d",i);
}
}
return 0;
}
修改如下,改动处见注释,供参考:
#include <stdio.h>
#include <math.h>
int main(void) {
int i, j;
int ret = 0;
for (i = 2; i <= 100; i++) {
int a = sqrt(i);
for (j = 2, ret = 0; j <= a; j = j + 1) { //for (j = 2; j < a; j = j + 1) 修改
if (i % j == 0) {
ret++;
break;
}
}
if (ret == 0) {
printf("%5d", i);
}
}
return 0;
}
【以下回答由 GPT 生成】
问题的核心是在第7步中判断数字i是否能被数字j整除时,条件判断错误。应该将j<a
修改为j<=a
,以保证能够遍历到平方根a的值。
此外,还可以进行以下优化: - 不需要使用sqrt()函数来计算平方根a,可以直接判断j*j是否大于i即可。 - 加入判断条件,若i能被任何一个在2到平方根a之间的数字整除,则可以直接跳出内层循环,提前结束判断。
以下是优化后的C语言代码:
#include <stdio.h>
int main(void){
int i,j;
int ret=0;
for(i=2;i<=100;i++){
int a=i/2; // 只需要遍历到i的一半即可
for(j=2;j<=a;j=j+1){
if(i%j==0){
ret++;
break;
}
}
if(ret==0){
printf("%5d",i);
}
ret = 0; //每次判断后需要重置ret的值为0
}
return 0;
}
优化后的代码将能够正确输出100以内的素数。
【相关推荐】