1 有趣的回文数
**题目需求:**对于任何自然数,将它自身和它的倒序数(反转过来)相加,再将得到的和与它的倒序数相加,一直重复,最终总会得到一个回文数。
提示;回文数,如 12321 就是回文数,从左向右或从右向左是同一个数字。
样例描述:
-
比如12+21=33,12 这个数只需要一步就能得到回文数。
-
再比如 265 这个数:
265+562=827
827+728=1555
1555+5551=7106
7106+6017=13123
13123+32131=45254 最终数字也是回文数字。
请编写代码验证任意自然数字经过上述操作后也会得到一个回文数。
解题流程:
此题有 2 个核心逻辑:
- 如何获取一个数字的反转数。最简单的方案就是使用字符串的切片功能。
- 如何判断一个数字是不是回文数,把自己和反转后的数字比较,如果相等说明是回文数,否则不是。
解决方案一:
# 接收用户输入数字,把数字当成字符串类型,以便使用节片功能
num = input("请输入一个数字:")
old_num = num
while True:# 使用切片反转num_rev = num[::-1]# 原数字和反转数字相加,需要转换成数字num_sum = int(num) + int(num_rev)# 判断是不是回文数,因为要使用切片,再次转换成字符串if str(num_sum) == str(num_sum)[::-1]:print(old_num, "最终得的回文数是", num_sum)breakelse:#继续num = str(num_sum)
思维扩展:
反转数字的逻辑:
# 功能:反转用户输入的数据
num=int(input('请输入一个数字'))
#保存反转后的数字
reverse_num=0
while num>0:temp=num % 10reverse_num=reverse_num*10+tempnum=num // 10
print(reverse_num)
回文数的逻辑:
# 功能:反转用户输入的数据
num=input('请输入一个数字')
left =0
right=len(num)-1
is_hw=Truewhile left<right:if int(num[left])==int(num[right]):left+=1right-=1else:is_hw=Falsebreak
if is_hw:print(num,"是一个回文数!")
else:print(num,"不是一个回文数!")
2. 圣经数 153
**题目需求:**任找一个 3 的倍数,把各位数字的立方相加,得出和,再把和的各位数字立方后相加,如此反复进行,最后必然出现“圣经数”(153)
如:24 是 3 的倍数,按照上述规则,进行变换的过程是:
24→2³+4³→(72)→7³+2³→(351)→3³+5³+1³→153
请编写程序证明用户输入的任一个数字经过上述的操作后最后会得到圣经数(153) 。
解题流程:
本题目的核心逻辑:如何分解数字的每一位,并求数字的立方和。
num = input("请输入一个 3 的倍数:")
old_num = num
if int(num) % 3 == 0:# 数字必须能被 3 整除,分解,并求分解后数字的立方while True:# 保存相加结果s = 0for i in num:# 注意,转换成 ints += int(i) ** 3if s == 153:print(old_num, "最终可以演变成圣经数 153")breakelse:# 继续num = str(s)
3. 以文件方式保存个人信息
把自己的家人的信息以文件的方式保存。把自己的成绩信息保存在文件中
本题主要是考核学生对文件读写知识的掌握程度。
with open("d:/self.txt",w) as f:f.write("姓名:张三")f.write("\n")f.write("年龄:20")
4. 求解因子
输入一个数字,并求解出此数字的所有因子,如 6的因子是 1,2,3,6 因子指能被数字整除的数字 。
num = int(input("请输入一个数字:"))
for i in range(1, num + 1):if num % i == 0:print(i)
5. 求平均分
一个班上有 5名学生,请编写程序输入 5 名学生的成绩并求解这 5 名学生的总分、平均分。
# 保存总分
s = 0
for i in range(5):score = int(input("请输入学生成绩:"))s += score
print("总分:", s)
print("平均分:", s / 5)
6. 求解分数相加
求解 1/2+2/3+3/4+4/5+5/6+6/7……99/100 的值
此题本质还是累加运算。观察后会发现,分子的变化是从 1 ~ 99,分母变化是从 2 ~ 100 。
s = 0
fz = 1
fm = 2
while fz <= 99:s += fz / fmfz += 1fm += 1
print("结果:", s)
题目演变:
1/2-2/3+3/4-4/5+5/6-6/7……99/100!
s=1/2
fz=2
fm=3
fh=1
for i in range(99):s+=(fz/fm)*fhfz+=2fm+=2# 1 -1 fh=-fhprint(fh)
print(s)
7. 随机数求和
题目需求:使用随机模块随机生成 20 个1~100之间的数字,并求解这20个数字相加的结果。
本题还是累加运算,只是累加数字来源来随机数。
import random
s = 0
for i in range(20):s += random.randint(1, 100)
print(s)
第二种解决方案:
和第一种方案比较,随机数的生成方式不同。
import random
s = 0
for i in range(20):s += int(random.random()*1000) % 100 +1
print(s)