6-7 使用函数输出水仙花数_Python实践例题自动生成水仙花数

a93f8a5dc547c32c346590e3afb070d1.gif点击上方蓝色字,查看更多精彩内容 ~~~什么是水仙花数

水仙花数是指一个 n 位数,它的每个位上的数字的 n次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)

相信大家不管学那个编程语言,老师都会在学完循环和运算符后让大家写一个程序,求出某位数的水仙花数有几个

这对初次接触编程的人来说是一个考验,因为不仅要会熟练掌握各个运算符的作用,还要巧妙使用循环和分支,对课堂知识的理解和掌握情况都是一个考验

先来看设计思路1

使用“input”,记录一个数字,这个数字就是水仙花数的位数。例如1111是一个四位数

(应该没有人几位数不理解吧)

2

将每位数拆分出来,并单独进行幂运算后相加

(为了巩固运算符的知识,这里不使用字符串特性法提取各位数)

3

判断相加后结果是否与原数相同,相同即输出

e1e6b9cde1a6275fa3cdcb6c92474c2b.gif有了思路,就可以开始上手试试 e1e6b9cde1a6275fa3cdcb6c92474c2b.gif0 1输入部分

使用变量“x”储存输入内容,为了严谨些,输入的内容转化为字符串形式再赋值给“x”

x=int(input("请输入位数,用来求出该位数的水仙花数:"))
e1e6b9cde1a6275fa3cdcb6c92474c2b.gif0 2生成指定位数的数

这里使用For循环的一个特性

设置从“10^(位数减一)”到“10^位数”,步长为1(默认)的For循环

例如x=3则从“10^2即100”到“10^3即1000”,由于For循环的特性,到达最终值就停止循环,所以并不会到1000

我们就可以利用循环时经过的数来一个个做测试,要是时水仙花数就输出

for i in range(10**(x-1),10**x):#初学者别忘了冒号

友情链接:Python3的循环语句

e1e6b9cde1a6275fa3cdcb6c92474c2b.gif0 3拆分每位数(从这开始数学不好的请做好准备)

我们主要会用到这两个运算符,分别是“//”和“%”

“//”整除取整数,例子:

a=7//2

print(a)

>>>3

"%"整除取余数,例子:

a=7%2

print(a)

>>>1

假设我有个数字‘123’

首先,我想得到个位数,我们可以将123取除10的余数

即:123÷10=12......3  这个3就是余数

同理,想得到十位数2,可以这样

123//10=12

12%10=2

百位数同理

最后程序如下

pd=0  #初始定义一个临时变量for j in range(0,x):   #x为位数,i是几位数就循环几次    a=i//(10**j)%10   #利用j加上面讲的,变形得到(i是一开始那个For循环得到的一个数)    pd+=a**x  #最后将得到的这一位数幂运算后累加到临时变量“pd”上,为接下来做准备
e1e6b9cde1a6275fa3cdcb6c92474c2b.gif04最后的判断与输出

最后,判断临时变量pd是否等于原先的数i,要是相等就输出

if pd == i:    print(i)

我们的程序还没结束,细心的朋友一定发现,这个程序有一个很致命的bug

不管要求输出几位数的水仙花数,都没有结果输出

Why。。。为什么,代码看上去没什么问题,该有的也都有,怎么就没有结果

我们仔细捋捋。是不是漏了什么?

其实,每次大循环完,pd的值并没有清零,而是带着上一个数的计算结果带到了这个数的计算

假如上一个123的结果1^+2^3+^3,带到了下面,又加上了124的结果。即1^+2^3+^3+1^+2^3+^4

pd会越来越大,并且永远不可能等于i,所以不会有任何的结果

这时候我们要在循环内合适的地方清空它,具体怎么操作,留给你们了

自此,我们的程序基本上已经完成,只需简单的调试和修饰即可

以下是完成后的代码,我建议看到这可以尝试自己先动手试试,先不直接看成品

x=int(input("请输入位数,用来求出该位数的水仙花数:"))a=quantity=0for i in range(10**(x-1),10**x):    pd=0    for j in range(0,x):        a=i//(10**j)%10        pd+=a**x    if pd == i:        print(i)        quantity+=1print(ws,"位数的水仙花数有",quantity,'个')

ce7c34f847bf1507fa5397e646910cbd.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值