打印出10000以内素数的个数代码实现
兄弟们 我这个代码问题到底出现在哪里 求大家指点.h>
#include <stdbool.h>
int main()
{
int a,ch,sum = 0,sh;
_Bool flag = 1;
for(ch = 0; ch <= 10000; ch++)
{
for(a = 2;a <= ch / 2;a++)
{
if(ch % a == 0)
{
flag = 0;
}
else
{
goto A;
}
}
A:if(flag)
{
sum++;
}
}
printf("10000以内共有%d个素数!",sum);
return 0;
} flag 没有重新置为 1,而且有逻辑问题,应该是先跑完整个循环再判断 flag 为不为 0 来决定是否是素数,
你循环都没有执行完怎么能保证后面没有它的约数,你怎么就用 goto 跳去判断了?#include <stdbool.h>
int main()
{
int a,ch,sum = 0,sh;
_Bool flag = 1;
for(ch = 0; ch <= 10000; ch++)
{
for(a = 2;a <= ch / 2;a++)
{
if(ch % a == 0)
{
flag = 0;
}
}
if(flag)
{
sum++;
}
flag = 1;
}
printf("10000以内共有%d个素数!",sum);
return 0;
} #include <stdio.h>
#include <stdbool.h>
int main(void)
{
int a , ch , sum ;
_Bool flag ;
for(sum = 0 , ch = 2 ; ch <= 10000 ; ch ++){ // 素数从 2 开始
for(a = 2 , flag = 1 ; a * a < ch + 1 ; a ++) { // 假定 ch 是一个素数
if(ch % a == 0) { // 枚举可能的因子 a 否定假设
flag = 0 ;
break ;
}
}
if(flag) sum ++ ;
}
printf("10000以内共有%d个素数!\n" , sum) ;
} isdkz 发表于 2022-4-20 23:26
flag 没有重新置为 1,而且有逻辑问题,应该是先跑完整个循环再判断 flag 为不为 0 来决定是否是素数,
...
好兄弟受教了 意思我明白了 可是为什么比答案(1229)多两个哇 运行出来是1331{:10_243:} 救赎自我- 发表于 2022-4-21 00:22
好兄弟受教了 意思我明白了 可是为什么比答案(1229)多两个哇 运行出来是1331
1231 打错了 本帖最后由 isdkz 于 2022-4-21 00:27 编辑
救赎自我- 发表于 2022-4-21 00:22
1231 打错了
不好意思,我刚刚看漏一个了,素数应该从 2 开始算,因为 0 和 1 都不是素数#include <stdbool.h>
int main()
{
int a,ch,sum = 0,sh;
_Bool flag = 1;
for(ch = 2; ch <= 10000; ch++) // 这里
{
for(a = 2;a <= ch / 2;a++)
{
if(ch % a == 0)
{
flag = 0;
}
}
if(flag)
{
sum++;
}
flag = 1;
}
printf("10000以内共有%d个素数!",sum);
return 0;
} jackz007 发表于 2022-4-20 23:39
我去 大佬 用你的代码跑出来了 请问其中a * a < ch + 1 是什么意思啊 可以解释一下吗{:10_264:} isdkz 发表于 2022-4-21 00:25
不好意思,我刚刚看漏一个了,素数应该从 2 开始算,因为 0 和 1 都不是素数
牛 受教了 膜拜大佬{:10_298:} 救赎自我- 发表于 2022-4-21 00:31
我去 大佬 用你的代码跑出来了 请问其中a * a < ch + 1 是什么意思啊 可以解释一下吗
a * a 就是 a 的平方,a 的平方小于 ch + 1也就是 a 小于等于 ch 的开平方,
至于为什么求素数只需要到开平方就行了,你可以看一下这个,百度上也有大把:
https://blog.csdn.net/ningmengshuxiawo/article/details/106988903 你好,首先建议不要使用goto
使用goto不仅很难让人看懂
而且非常容易出bug
建议自己定义一个prime函数
判断是否是质数
像这样
bool prime(int n){
if(n==1)return false;
if(n==2)return true;
for(int i=2;i<n;i++){
if(n%i==0){
return false;
}
}
return true
}
页:
[1]