帮忙翻译一下下面的程序,后半部分有些看不懂,最好是每句都解释下,清楚些

源程序是:
#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;
}
}

}

这段代码是求3~100间的素数。但中间有个错误,看下面的注释:
void main(){
int n,k,i;//定义控制变量
int m=0;//素数计数变量
for(n=3;n<=100;n=n+2){//遍历3~100间的所有奇数
k=sqrt(n);//取所选奇数的平方根取整作为控制除数的范围
for(i=2;i<=k;i++)//用2到整数k去除所选之数
if(n%i==0)break;//若能整除,则所选之数不是素数
if(i>k){//这里要加一句if(i>k)以控制以下是在处理一个素数
m++;//素数计数
cout<<setw(5)<<n;//输出这个素数,占宽5右对齐
if(m%8==0)cout<<endl;//每输出8个素数则加一回车
}
}
}
供参考,希望有帮助……追问

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)
看到这茅塞顿开啊~高手啊~谢谢了~随便问一下这个程序是不是算低级的了?我什么时候才能自己编到这程度喃?

追答

其实代码没有很高级、很低级之分。代码的关键是逻辑正确加精练(不过多做无用的事),如果再考虑一下便于阅读,那就是很好的代码了……本人管见!

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-08
for(n=3;n<=100;n=n+2)/从n=3开始循环到100,每次增加2,n=3、5、7、9、11、13……
{
k=sqrt(n);//n开方,k=1、2、2、3、3、3……(小数点后的被省略)
for(i=2;i<=k;i++)//从2到k;当k为1的时候循环没有执行而直接跳过
if(n%i==0)break;//如果n是i的整数倍,也就是刚好除尽,这时候跳出循环。执行下面大括号中的代码,for(i=2;i<=k;i++)到这里结束,和下面无关。
{
m++;//自增1,m=0、1、2、3……这个用于记录输出数据个数
cout<<setw(5)<<n;//输出n,setw函数用于使输出右对齐
if(m%8==0)cout<<endl;//8的整数倍时换行
}
}

如果你没有写错的话这个程序只是输出了3-99的奇数。没有其它任何作用,而且内层循环和判断是完全没有必要的。
楼上对。
第2个回答  2012-03-08
买本书吧。追问

本来就是书上写的得嘛,只是看不懂,解释下嘛

相似回答