osc里贴代码时貌似不全,而且没人看,以后还不发了吧
今天在学习C语言时遇到一个题目,要求程序满足:用户输入任何一个整数,程序判断其是否为质数,然后输出判断的结果。
看到这个要求,我头脑中首先闪过的是:什么是素数?然后才想到素数是只能被1和其本身整除的数,然后我就根据这个定义写最原始的代码。
/*
Function:判断一个数是否为质数
Author:Shura
*/
#include<stdio.h>
int main(){
int k=0,input=0;
scanf("%d",&input);
for(int i=1;i<=input;i++){//从1开始除,一直到输入的数本身
if(input%i==0){
k++;
}
}
if(k==2){//如果只被1和该数本身除
printf("这是质数\n");
}
else {
printf("这不是质数\n");
}
return 0;
}
然后我就开始测试,发现随便输入几个数字都能正确判断出来,但是 当我输入负数时,发现竟然都提示不是质数,于是我就去百度了一下,原来质数必须是大于1的整数,而我的程序却没有限制,所以bug就诞生了,修复方法很简 单,对于输入的值加个判断即可,并且我还发现:既然每次都要除1和它本身,那么如果直接跳过1和它本身,程序的效率应该会得到提高,于是把代码修改了一 下。
/*
Function:判断一个数是否为质数
Author:Shura
*/
#includeint main(){
int k=0,input=0;
scanf("%d",&input);
for(int i=1;i<=input;i++){//从1开始除,一直到输入的数本身
if(input%i==0){
k++;
}
}
if(k==2){//如果只被1和该数本身除
printf("这是质数\n");
}
else {
printf("这不是质数\n");
}
return 0;
}
然后我继续测试,发现数字达到千万级时程序开始变得有点卡了,而 到亿级时,程序的判断时间就更长了,我就开始考虑怎么优化,然后想到:既然质数的定义规定了只能被1和本身整除,那么如果它被其他的数除过一次了,应该就 可以直接判断这不是质数,直接跳出循环了。最后的完成品诞生了,当然还有点小问题,因为不同CPU int的上限不同,只能简单的设置不能超过十亿
/*
Function:判断一个数是否为质数
Author:Shura
*/
#includeint main(){
int k=2,input=0;
scanf("%d",&input);
if(input999999999){
printf("输入的数有误,请重新输入\n");
return 1;
}
for(int i=2;i<input;i++){//直接从2开始除,一直除到输入的数(不包括本身)
if(input%i==0){
k++;
}
}
if(k==2){//如果只被1和该数本身除,那么k应该不变还是2
printf("这是质数\n");
}
else {
printf("这不是质数\n");
}
return 0;
}
总结
我确实比较无聊,纠结于这些不重要的细节,但是我想从一开始就培养一种细心的习惯,因为细心太重要了,通过3年的高中生涯,让我知道的马虎害死人,希望我能在若干年后,再看这篇文章时,我能感谢自己从当时开始培养起一种细心的习惯吧!
原文发表在我的博客里:http://chenxuefeng.net.cn/2014/06/2693.html