这是我写的质数判断程序,数数有多少个错误吧……
都是年轻时候犯下的错啊……
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,但是没有解决永远只输出yes的问题,同时还引入了一个新问题。
因为没有加花括号,所以在进行判断之后,不管是否为真,会执行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 √
完成要求的任务 √
原文:http://www.cnblogs.com/xiayezhige/p/4976288.html