#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是素数吗,请教一下大家。
应该是double的强制类型转换出了问题,转换后数值不对什么的,25的确不是素数,素数是说除了1和其本身外没有数可以整
除来着,i等于6应该是有问题,而且求素数不应该这么做吧。。(个人观点,不记得了)
不应该是用for循环暴力枚举求余来判断吗?
你可以在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)后面加上一个分号即可
这个函数用来求素数
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;
}
如果你注意代码风格:
在每个for语句,if语句里无论有几条语句,都加上花括号{} 可能就不会出现这种问题....