上节讲了素数效率问题,这节就用一个拓展应用进一步熟悉一下。
问题:
如果一个整数的不包含自身的所有因数之和等于自身,就称这个数为完数。编写一个程序求10000以内(含)的完数及数量。
输出:两行,第一行输出所有完数,用空格分隔。第二行输出完数的数量显示“完数共有***个”,
分析:
与素数判断不同的是此题要的数n之外的所有因子即包括1,所以循环变量i的初始值应该从1开始,但是因为还需要在求出因子的同时还要进行求和sum1,1的对应因子是n本身,所以i的初始值应该从2开始,之后再将sum1+1(将丢掉的因子1加回来)与n进行比较。如果是完数则需输出i,并记录完数数量和sumw。
此外,因为要进行10000以内的所有所有数的判断,所以应该在上述循环之外加循环,循环变量2=
代码:
sumw=0
for k in range(2,10001):
sum1=0#每一次判断k是否是完数都需要赋初值0
i=2#因为1的对应因数是n,所以不能作为因子判断的初始值
while(i*i
if(k%i==0):
sum1=sum1+i+k/i;#i是因子,k/i是i的对应因子,这是关键
i=i+1
if(sum1+1==k):#因为1要作为完数判断的因子之一,所以需要加上
print(k,end=" ")#不换行,用空格分隔同行内容
sumw=sumw+1
print()#换行
print("共有完数",sumw,"个")
看似很简单的一段代码,要想写出来却比较难,需要考虑的细节很多。例如sumw和sum1的初始值位置。循环变量的初始值,sum为什么+1,为什么sum1=sum1+i+k/i ,为什么有一行print()。看看注释能看懂不?
领取专属 10元无门槛券
私享最新 技术干货