源程序是:
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
void main()
{
int n,k,i;
int m=0;
for(n=3;n<=100;n=n+2)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0)break;
{
m++;
cout<<setw(5)<<n;
if(m%8==0)cout<<endl;
}
}
}
if(i>k){//这里要加一句if(i>k)以控制以下是在处理一个素数
m++;//素数计数
这是什么意思?还有为什么要用平方根作为除数的范围?我有点笨。。请高手解释详细点,谢谢
1.若不加if(i>k),那么无论前面所判断的n是不是素数都要执行m++; coutk),说明if(n%i==0) break;语句没有被执行,2~k的所有i都不能整除n,没有提前跳出for循环,所以i才能是素数!在2~k里只要有一个i整除了n,则n%i==0,就要执行if(n%i==0) break;语句而提前跳出for循环来,n就不是素数。这是你这段代码的核心哟!
2.开平方是为了提高代码执行时效。设n=10,开平方取整k=3,用2、3去除10就可以了,没有必要再用4、5、6、7、8、9去除10了。因为用4以上的数除10的商小于3(a÷b等于c的话,那a÷c肯定就等于b),而小于3是否有整除情况我们已经做过了(用2除过了),为什么还要反过来做一次呢?这里用的原理是一个数是它的两个平方根之积!n较小时这种节约可能不明显,但n很大时就非常明显了;取个不太大的n=1001来说明一下:1001开平方取整是33,我们顶多做32次除法就知道1001是不是素数了,而不开方的话最多要做999次除法才能确定1001是不是素数,看看哪个节省时间?当然我们还可以再提高代码的时效:因为2以外的素数都是奇数,而奇数又不能被偶数整除,所以我们可以只判断大于2的奇数是不素数就行,也不用2、3、4...这样挨着去除,只用奇数除就可以了,这样又能节约近一半时间……
(a÷b等于c的话,那a÷c肯定就等于b)
看到这茅塞顿开啊~高手啊~谢谢了~随便问一下这个程序是不是算低级的了?我什么时候才能自己编到这程度喃?
其实代码没有很高级、很低级之分。代码的关键是逻辑正确加精练(不过多做无用的事),如果再考虑一下便于阅读,那就是很好的代码了……本人管见!
本来就是书上写的得嘛,只是看不懂,解释下嘛