看了柴田望洋的明解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;
}
运行结果:
这样运算次数就减少许多啦,提高效率,昂~~~