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是同级关系