【c】质数判断

 

这是我写的质数判断程序,数数有多少个错误吧……

都是年轻时候犯下的错啊……

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int N;
 5     int i;
 6     int f;
 7     scanf("%d",&N);
 8         for(i=1;i<N;i++)
 9         {
10             f=N%i;
11             if(f==0)
12             printf("NO");
15         }
16 printf("YES");
17 return 0;
18 }

 

 

 

 

错误一:

8      for(i=1;i<N;i++)
9        {
10           f=N%i;

for先给i赋值1,然后再执行 i++

但是万万没想到,++后缀是使用i后再改变i的值

所以

10           f=N%i;    

等价于

1             f=N%1;
2             i=i+1;

f永远等于0

程序在第一步永远会输出NO

除了N=1的情况,这时会跳过for循环

 

错误二:

没有设置终止条件,

程序在输出第一个NO之后,for循环没有中断,会对i不断地+1,+1,+1业内俗称续命,并进行if(f==0)的判断

判断为真,就会继续输出一个NO,直到for循环结束,永远都会输出一个yes

输入4,得到的结果会是NONOYES

输入1000,得到的是很长的NONONONONONONONONONONONONONONOYES

15个no,我数过了……

另外,N应该改成n,按照规范只有常量才可以使用大写

 

解决:

按照图中的这个思路,应该在

12                 printf("NO");

后加入一个终止命令才可以终止这样不停地输出,break肯定不行,经过高人百度指点,应该加入return 0;

12               printf("NO");
13               return 0;

这一下虽然只会输出一个NO,但是引入了一个新问题。

因为没有加花括号,所以在进行判断之后,不管是否为真,都会执行return 0;的操作,程序结束

也就是说不输出NO的话就会什么也不做,永远不会告诉你YES。

 

大概几天后

#include "stdio.h"
#include "math.h"
int main()
{
    int m, i,f,a;
    scanf("%d",&m);
        for(i= 2; i< m; i++,a=0 )
  {
            f= m % i;
            if(f == 0)
        {          a=1;
                   printf("NO");
                   return 0;
        }

    }
        if(a == 0)
        printf("YES");
}

完全改正版出来了,虽然十分拖沓,但还是艰难的完成了判断质数的任务

i初始值应该等于2 √

//经过测验,如果把i++改为++i,取模运算的时候i的值依然等于1,这点弄不明白……不是使用前对i加1吗?

if后面要接复合语句的话需要加花括号 √

常量大写,变量小写√

只输出YES或NO √

完成要求的任务 √

 

posted @ 2015-11-18 23:34  1193972689  阅读(731)  评论(0编辑  收藏  举报