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

2024-11-24 12:49:00
推荐回答(2个)
回答1:

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:

首先,说一下程序的基本思想:因为素数(除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的循环判断。