PAT乙级_1117 数字之王_Python_AC解法_无疑难点
注意事项:
因为笔者的编程水平以自学为主,代码结构可能比较混乱、变量命名可能不够规范。
文章中的AC解法不一定最优,并且包含笔者强烈的个人风格,不喜勿喷,但欢迎在评论中理性讨论或者给出提升建议。
文章中提到的疑难点仅为个人在刷题过程中所遇到的情况,如有读者存在其他疑难点,欢迎在评论中加以补充,笔者会尽量将其加入到文章内容中。
合集:
PAT乙级_合集_Python_AC解法
题目:
1117 数字之王
题目描述:
给定两个正整数 N1<N2。把从 N1 到 N2 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。
例如 N1=1 和 N2=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。
本题就请你对任意给定的 N1<N2 求出对应的数字之王。
输入格式:
输入在第一行中给出两个正整数 0<N1<N2≤10^3,其间以空格分隔。
输出格式:
首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10
就应该在两行中先后输出 6
和 8
。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10 14
输出样例:
2
0 8
代码限制:
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
AC解法:
# 获取输入的数据
n, m = map(int, input().split()) # 获取输入的 n1 n2# 处理数据
nums = [i for i in range(n, m + 1)] # 根据输入的 n1 n2 生成数字列表
while True: # 无限循环if max(nums) < 10: # 若数字表中的最大值小于 10 ,即所有数字都是一位数break # 跳出循环for j in range(n, m + 1): # 遍历每个数字tmp = 1 # 创建变量用于存储累乘结果,初始值设置为 1for k in str(nums[j - n]): # 遍历数字中的各位上的数字tmp *= int(k) ** 3 # tmp 再乘上当前位数字的立方值nums[j - n] = sum([int(q) for q in str(tmp)]) # 将当前数字更新为累乘结果的各位的和
cnt = {} # 创建空字典用于计数
for s in set(nums): # 遍历去重后的数字列表中的数字c = nums.count(s) # 统计该数字在数字列表中出现的次数if c not in cnt: # 若该次数不在字典的键中cnt[c] = [s] # 以次数为键,列表为值,列表的初始值为该数字else: # 该次数已在字典中cnt[c].append(s) # 该次数的列表添加上该数字# 输出结果
king = max(cnt.keys()) # 数字之王出现的次数即字典键中的最大值
print(king) # 打印次数
print(*sorted(cnt[king])) # 按格式要求输出排序后的该次数的列表
题目解读:
本题描述比较易懂。
先获取输入的数据,再根据输入的两个数字生成数字列表,按公式循环处理数字列表中的所有数字直至全为一位数,然后统计数字列表中各个一位数出现的次数,最后按格式要求输出最多的次数及其对应的每个一位数。
疑难点:
本题无疑难点。