三位数的水仙花数和四位数的玫瑰花数

example1:三位数的水仙花数

水仙花数(Narcissistic number):指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153。各乘号^前面的数字都来自153),也称“自幂数”(自己的3次幂)

方法一:int转str,索引str获取各个位的数(容器为空字符)

s = ""
for i in range(100, 1000):    #遍历三位数,注意遍历的 i 此时是int类型
    a = str(i)    #转为字符串,以便索引
    if pow(eval(a[0]),3) + pow(eval(a[1]),3) + pow(eval(a[2]),3) == i :
        s += "{},".format(i)  #此时的i还是int类型,放进引号中,整体变成一个字符
        c = s[:-1]  #字符串、列表等组合数据类型才能索引。一个数值不能索引,如数值a=134,则a[0]没有意义,进而也不存在什么切片[N,M]。此处的s还是字符串,所以c也是
print(c)    #将字符串打印出来,呈现的是引号内的内容,最外层的引号没有打印出来

方法二:int转str,索引str获取各个位的数(容器为空列表)

s = []
for i in range(100,1000):
    a = str(i)
    if pow(eval(a[0]),3)+pow(eval(a[1]),3)+pow(eval(a[2]),3) == i:
        s.append(a)
        c = ",".join(s)
print(c)

对比方法一和方法二的异同:

(1)行1,前者创建的容器为一个空字符串,后者创建的容器为一个列表。两者都是为了存储满足条件的“水仙花数”

(2)行5,前者将后续的“水仙花数”一个个插进去创建的“str容器”中,后者将后续的“水仙花数”一个个插进创建的“list容器”中

(3)行6,前者去掉最终得到的字符串的尾巴(逗号),后者将元素为str类型的列表变为数字序列。

 

 

Notes:

(1) 产生一个数据列,需要创建一个容器,将满足条件的元素依次存入,有两种方法:创建空字符,通过赋值迭加,即

s = s + " "  如下:

因为字符串之间可以通过相加实行字符的结合,其中加号表示拼接。在s = s + " " 的引号的作用是将其内的任何类型元素转为字符,但如果其内是一个变量i,即在循环结构内,每循环一次,i就变化一次,那么只能用format格式化,即s += "{},".format(i)
。其中{}的作用是防止引号将变量i当作原原本本的字母i。

(2)列表的所有操作方法,如append在操作完后,不需要赋值,如赋值给了b,则b也不会返回任何值。这是永久性改变:

但是列表本身是可以赋值的。如:ls = ["1","2"]赋值给变量t,但列表的赋值并不是产生一个新的列表,而是共用一个列表,即给ls起了一个别名。对ls怎么操作,实际也就是对t怎么操作:

这就是列表的赋值与其它类型的赋值的不同之处

方法三:求余运算获取一个数的各个位的数

for i in range(100,1000):
    bai=i//100    #百位:用该数去除100,取商
    shi=i%100//10    #十位:用上次(第一次)得到的余数去除10,取商
    ge=(i%100)%10    #个位:也是用上次(第一次)得到的余数去除10,但取余
    if bai**3+shi**3+ge**3 == i:
        print(i)

建议从最高位开始,个位结束。

原理:如数字352。则可以写成352=3*100+5*10+2*1

step1(最高位):用352÷100,商为等号右边与100相乘的数字3。余数为该被除数352除最高位外,剩下的数字。即除3外,剩下的52,也就是等号右边的5*10+2*1

step2(十位):对step1得到的余数52,用52÷10,商为等号右边与10相乘的数字5。余数为该被除数52除最高位外,剩下的数字,即除5外,剩下的2.也就是等号右边的2*1

step3(个位):step2所得到的余数2就是个位数

产生的结果如下:(但还不符合题目的输出要求。参照notes(1)对代码稍作修改即可)

example2:

for i in range(1000,10000):
    a = str(i)
    if pow(eval(a[0]), 4) + pow(eval(a[1]), 4) + pow(eval(a[2]), 4) + pow(eval(a[3]), 4) == i:
        print(i)

example3:

#此为"Python语言程序设计"(中国大学MOOC平台)的答案
count = 0
while count < 3:
    name = input()
    password = input()
    if name == 'Kate'and password == '666666':
        print("登录成功!")
        break
    else:
        count += 1
        if count == 3:
            print("3次用户名或者密码均有误!退出程序。")

分析:

(1)有几行输入,就设置几个input语句,且建议连着写,如行4和5

(2)只有当每行全输入对时,才成功,所以判断条件就两种情况:要么全对,否则出错。不要考虑第一行对且第二行错、第一行错且第二行对,一律归到出错的情况

(3)无论哪种情况,执行完必须有一个退出操作。全对的退出用break,出错的退出时while循环结构控制的,即执行完3次后就退出。如果没有break,则全对操作完后,程序还在结束:

(4)切记行11和12是隶属于else的,不能将它与if、else同级。因为else是对出错的情况进行处理的,而行12和13正是在出错的情况下才能进行这些操作,行10也是,所以行10、11和12是同级关系

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值