首页
学习
活动
专区
工具
TVP
发布

一知半解讲python第二季:5.寻找完数

上节讲了素数效率问题,这节就用一个拓展应用进一步熟悉一下。

问题:

如果一个整数的不包含自身的所有因数之和等于自身,就称这个数为完数。编写一个程序求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()。看看注释能看懂不?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181108G0X0NP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券