质数运算

看了柴田望洋的明解C语言,来写几篇博客回忆一下。这篇是关于质数运算的。先看第一版代码:

/*
	计算100以内的质数
*/

#include<stdio.h>

int main() {
	int i,no;
	int counter = 0;   //计数

	for(no=2;no<100;no++) {
		for(i=2;i<no;i++) {
			counter++;
			if(no%i==0)
				break;
		}
		if(i==no)
			printf("%d\n",no);
	}
	printf("除法运算次数为:%d\n",counter);

	return 0;
}

运行结果:

OK,现在发现除法运算次数为1132次,是不是有点多呢?需要想个办法来减少它。首先,我们知道:

1.大于2的2的倍数都不是质数,即除了2以外的偶数都不是质数;

2.除了2以外的质数都是奇数,所以除了2以外的质数不能被偶数整除;

3.综合一下前两个条件,再发现一个规律:质数no无法被小于no的质数整除;

4.先来看一个问题,100的公约数:2*50,4*25,5*20,10*10,20*5,25*4,50*2,全都列出来发现2*50和50*2其实是一组,只不过顺序颠倒了,所以,如果要求100的公约数,只需要在100的平方根及其之前判断就行了。同理,我们这个问题也是如此,所以质数no无法被小于等于no的平方根的质数整除。


好了,现在可以来看第二版代码了:

/*

计算100以内的质数
*/


#include<stdio.h>


int main() {
	int i,no;
	int a[500];       //  保存质数的数组
	int p = 0;        //  已得到的质数个数
	int counter = 0;

	a[p++] = 2;
	a[p++] = 3;       //  保存2和3


	for(no=5;no<100;no++) {
		int flag = 0;
		for(i=1;counter++,a[i]*a[i]<=no;i++) {
			counter++;
			if(no%a[i]==0) {
				flag = 1;
				break;
			}
		}
		if(!flag) {
			a[p++] = no;
		}
	}

	for(i=0;i<p;i++) {
		printf("%d\t",a[i]);
	}
	printf("\n乘除运算次数:%d\n",counter);


 	return 0;
}



运行结果:

这样运算次数就减少许多啦,提高效率,昂~~~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值