求VFP编程高手解释程序 输出3-100之间的所有素数

作者&投稿:泷转 (若有异议请与网页底部的电邮联系)
vfp编程,编程输出3~100之间的所有素数~

clear
??"3到100之间的素数为:"
for i=3 to 100
x=0
for j=2 to i-1
if i/j=int(i/j)
x=1
endif
endfor
if x=0
??alltrim(str(i))+" "
endif
endfor

#include
#include
main()
{
int m,i,k,h=0,leap=1; //leap为标志位
printf("
");
for(m=101;m<=300;m++) //实现100到300的素数输出
{
k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0) //如果数值能被2到根号m整除,将标志位赋值为0;跳出循环
{
leap=0;
break;
}
if(leap) //如果标志位为1,表示从2到根号m不能整除m,即m是素数
{
printf("%-4d",m); //格式输出,相信你应该懂得,使输出结果好看
h++;
if(h%10==0) //每十个换行
printf("
");
}
leap=1;
}
printf("
The total is %d",h);
}

set talk off
clear
for m=3 to 100 step2 &&在3到100之间的所有奇数中找素数,因为偶数一定不是素数。
n=int(sqrt(m)) &&这是一个数学知识点,把一个数m分解为两个约数的乘积,总有一个约数一定是小于等于根号m的。所以只需要判断在2到根号m中这个数有没有约数就可以了。也可以改为 n=m-1 ,这样就是在整个符合条件的范围内全找遍。 比如要找17有没有约数,最笨的方法是 看17 能不能被 2 3 4.........16为止的数整除。简单的方法看17能不能被 2 3....根号17之间的整数整除开。
for i =2 to n &&参考上一段解释,设置用来除m的数的范围。
if mod (m,i)=0 &&如果m被i整除了,
exit &&退出此循环,到endfor的下一行。说明不用继续查找了,已经找到m有一个约数i
endif
endfor
if i>n && 只有i的值从2 3 ....到n 取一遍之后,退出循环时,i才满足大于n,说明没有中途退出循环,也就是说在2----n范围内没有找到能整除m的数,那就输出 这个数,说明这个数是素数。
?m
endif
endfor

首先你这个程序第5行有错误,我已经改过了。程序用文字解释起来太麻烦了,不知你看懂没?

首先,说一下程序的基本思想:因为素数(除2以外)一定是是奇数,所以对3-100之间的所有奇数进行逐一判断。根据数论的基本定理,判断一个数m是否为素数时,只需计算用从3到根号m取整的数依次去除m,判断是否有余数为0(等价于整除)的情况即可。

下面对程序主干部分逐行进行解释:
for m=3 to 100 step 2 &&设定步长为2,从3开始取值,每次递进两个,直到100.即对3-100之间的所有奇数进行遍历。
n=int(sqrt(m)) &&计算根号m取整
for i =3 to n &&从3到n开始遍历,后面会用m依次除以3到n,然后计算余数,由于都是奇数,因此不需要从2开始做判断。直接从3开始。
if mod (m,i)=0 &&判断条件,m除以3到n之间的任何一个数是否的余数等于0,如果是,执行下面程序。注意,此行有错误!因为任何数都可以被其自身整除,所以条件应当修改为:if m!=i && mod (m,i)=0
exit &&停止当前求余循环,判断下一个m
endif &&结束if语句
endfor &&结束求余循环
if i>n &&判断条件,如果没有任何一个3到n之间的数可以整除m,则当前m是一个素数
?m &&在屏幕上显示这个m值
endif &&结束if语句
endfor &&结束从3-100的循环判断。