判断一个整数是否为质数浅谈

osc里贴代码时貌似不全,而且没人看,以后还不发了吧

Shura

        今天在学习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

转载于:https://my.oschina.net/u/586126/blog/279996

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值