c语言中素数判断问题。。。

#include
#include
void main(){
int m; // 输入的整数
int i; // 循环次数
int k; // m 的平方根

printf("输入一个整数:");
scanf("%d",&m);

// 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型 
k=(int)sqrt( (double)m );
for(i=2;i<=k;i++)
    if(m%i==0)

if(i>k)
    printf("%d是素数。\n",m);
else
    printf("%d不是素数。\n",m);
printf("%d",i);
return 0;

}

输入25,屏幕上显示25不是素数,但是i=6,不是应该显示25是素数吗,请教一下大家。

c

8个回答

应该是double的强制类型转换出了问题,转换后数值不对什么的,25的确不是素数,素数是说除了1和其本身外没有数可以整

qq_38506567
qq_38506567 if后面加上break语句之后,就可以避免这个事情了,但是不知道上面的代码出了什么问题
大约 3 年之前 回复

不应该是用for循环暴力枚举求余来判断吗?

除来着,i等于6应该是有问题,而且求素数不应该这么做吧。。(个人观点,不记得了)

你可以在if(i>k)这句之前打印一下i和k的值,你会发现它们相等。
原因在于你在if(m%i==0)这句后面没有加分号,因此程序认为下面的整个if和else块是for循环的循环体,当i=5的时候,进入if块,然后开始判断,刚好k也等于5,于是满足了else语句的条件,输出25不是素数这句话,然后for循环执行最后一句话,让i加1,于是你在后面打印i的时候变成了6
想要纠正这种情况的话,只要在if(m%i==0)后面加上一个分号即可

baidu_38862430
baidu_38862430 可以
大约 3 年之前 回复
qq_38506567
qq_38506567 恩恩,懂了。谢谢
大约 3 年之前 回复

这个函数用来求素数
int isPrime(int num) {
int i, flag = 0;
for(i = 2; i < sqrt(num); i++) {
if(num % i == 0) {
flag = 1;
break;
}
}
return !flag;
}

25确实不是素数。
可以从2开始循环,一直到sqrt(n),每一个都不能整除

#include
#include
bool sushu(int n)//判断是否为质数的函数
{
for(int i=2;i<=sqrt(n);i++)//从2到sqrt(n)枚举
if(n%i==0) return 0;//一旦有整除就不是
return 1;//否则就不是
}
int main()
{
int n;
scanf("%d",&n);//判断的数
if(n==1) printf("hehe");//特殊处理1
if(sushu(n)) printf("Yes");//是
else printf("No");//不是
}

#include 
#include 
void main(){
int m; // 输入的整数 
int i; // 循环次数
int j;
int k; // m 的平方根
printf("输入一个整数:");
scanf("%d",&m);

// 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型 
k=(int)sqrt( (double)m );
for(i=2;i<k;i++)//去掉了等号
    if(m%i==0)j=1;

if(j==0)
    printf("%d是素数。\n",m);
else
    printf("%d不是素数。\n",m);
printf("%d",i);
return 0;
}
u014603621
茶凉尐 再加个判断输入是否为1
大约 3 年之前 回复

如果你注意代码风格:
在每个for语句,if语句里无论有几条语句,都加上花括号{} 可能就不会出现这种问题....

qq_38855087
qq_38855087 最好有代码补全
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐