搜索
查看: 1983|回复: 4
打印 上一主题 下一主题

用for求一个数是不是质数。为什么我输入4显示是质数

[复制链接]
跳转到指定楼层
楼主
发表于 2013-6-5 21:30:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
求大神指教哪错了。。

#include <stdio.h>
int main()
{
        int k,i,n,m;
    scanf("%d",&m);

    k=0;
    for(i=2;n=m;i++)
    {        i<=n;
                if(n%i==0)
                        k=1;
        break;
    }
    if(k==1)
    {
                printf("是质数");
    }
    if(k!=1)
    printf("不是质数");
    sleep(5000);
        return 0;
}


最佳答案

查看完整内容

明显不是啊,这段的业务逻辑其实是也就是说,如果m=0,那么什么也不做;如果m!=0,那么计算一次m%i,如果等于0,那么将k的值赋为1,然后退出循环 也就等价于因为k的初始值是0,k=1的时候输出是质数。总体的逻辑就是 m为非零偶数时,输出是质数;否则,输出不是质数
楼主新帖
楼主热帖
沙发
发表于 2013-6-5 21:30:57 | 只看该作者
本帖最后由 rosynirvana 于 2013-6-6 13:13 编辑
gnow 发表于 2013-6-6 11:33
首先看到一个错误的就是for那里你把m的值赋给n,而不是比较。还有在判断n是否是素数时你是将1赋值给k,所以 ...

明显不是啊,这段
  1. for(i=2;n=m;i++)
  2.     {        i<=n;
  3.                 if(n%i==0)
  4.                         k=1;
  5.         break;
  6.     }
复制代码
的业务逻辑其实是
  1. for(i=2;n=m;i++){
  2.    if(n%i==0)
  3.    k=1;
  4.    break;
  5. }
复制代码
也就是说,如果m=0,那么什么也不做;如果m!=0,那么计算一次m%i,如果等于0,那么将k的值赋为1,然后退出循环
也就等价于
  1. if(m!=0 && m%2==0)
  2.   k=1;
  3.   
复制代码
因为k的初始值是0,k=1的时候输出是质数。总体的逻辑就是
m为非零偶数时,输出是质数;否则,输出不是质数
板凳
发表于 2013-6-5 21:49:05 | 只看该作者
  1. int k,i,n,m;
复制代码
这种变量名是应该绝对避免的,因为没办法知道你这些变量是用来干什么的,特别是一股脑写在开头的情况下。
  1. int i, num, isPrime,upper;
复制代码
就能看出来变量是用来做什么的了。
  1. scanf("%d", &num);

  2. isPrime = 1;
  3. upper = (int)sqrt(num);
  4. for(i=2; i<=upper; ++i)
  5.   if(num % i ==0){
  6.     isPrime = 0;
  7.     break;
  8.   }

  9. if(k)
  10.   puts("A prime");
  11. else
  12.   puts("not a prime");
复制代码
首先计算试除的上界,这个上界是√num,你可以自己证明。
先假设是质数,然后试除,如果发现能整除,那么就标记然后退出循环。如果整个循环都没有能整除的情况,那么说明是质数。

这忽略了除错的情况(例如输入是负数,是1的时候,你可以自己实现)

最后,用sleep是不好的,而且你也没声明sleep的原型

地板
发表于 2013-6-6 11:33:17 | 只看该作者
首先看到一个错误的就是for那里你把m的值赋给n,而不是比较。还有在判断n是否是素数时你是将1赋值给k,所以你不管输入是什么值都是质数。。不信的话你可以再试试。
5#
 楼主| 发表于 2013-6-7 20:16:53 | 只看该作者
茫茫然怎么破= =。虽然梭我会了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表