qq_38506567
qq_38506567
采纳率0%
2017-05-20 02:18 阅读 1.7k

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是素数吗,请教一下大家。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

8条回答 默认 最新

  • qq_38855087 qq_38855087 2017-05-20 02:38

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

    点赞 2 评论 复制链接分享
  • qq_38855087 qq_38855087 2017-05-20 02:41

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

    点赞 1 评论 复制链接分享
  • qq_38855087 qq_38855087 2017-05-20 02:39

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

    点赞 评论 复制链接分享
  • Runner__1 T_world 2017-05-20 02:44

    你可以在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)后面加上一个分号即可

    点赞 评论 复制链接分享
  • Dear_Mr Dear_Mr 2017-05-20 03:44

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

    点赞 评论 复制链接分享
  • C20191904 C20191904 2017-05-20 04:45

    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");//不是
    }

    点赞 评论 复制链接分享
  • u014603621 茶凉尐 2017-05-20 05:45
    #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;
    }
    
    点赞 评论 复制链接分享
  • Small_Pond Small_Pond 2017-05-20 12:57

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

    点赞 评论 复制链接分享

相关推荐