描述

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请编程输出当年维纳的年龄。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入格式

该题目没有输入‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出格式

一个正整数(维纳当年的年龄)

年龄的立方是个4位数
计算年龄的3次幂,结果转为字符串后长度应为4

  1. len(str(age ** 3)) == 4

我年龄的4次方是个6位数
计算年龄的4次幂,结果转为字符串后长度应为6

  1. len(str(age ** 4)) == 6

这10个数字正好包含了从0到9这10个数字

  1. set(str(age ** 3))|set(str(age ** 4)) == set(map(str,range(10)))
  2. # 或
  3. set(str(age ** 3))|set(str(age ** 4)) == {'0','1','2','3','4','5','6','7','8','9'}
  4. # 或
  5. set(str(age ** 3)).union(str(age ** 4)) == {'0','1','2','3','4','5','6','7','8','9'}

每个都恰好出现1次
因为两个字符串共有10个数字,若满足前一个条件,则已经满足每个数都只出现一次的要求了,此条可以不再单独判定。
完整参考代码如下:

  1. def ageJudge():
  2. for age in range(100):
  3. if len(str(age ** 3)) == 4 and len(str(age ** 4)) == 6:
  4. if set(str(age ** 3))|set(str(age ** 4)) == set(map(str,range(10))):
  5. return age
  6. if __name__ == '__main__':
  7. print(ageJudge()) # 调用函数,输出结果

实际上,我们知道30 3 = 27000,已经超过9999,是5位数,而10 3=1000,正好是第一个4位数,所以遍历范围可以缩小:

  1. def ageJudge():
  2. for age in range(10,30):
  3. if (len(str(age ** 3)) == 4 and len(str(age ** 4)) == 6
  4. and set(str(age ** 3))|set(str(age ** 4)) == set(map(str,range(10)))):
  5. return age
  6. if __name__ == '__main__':
  7. print(ageJudge()) # 调用函数,输出结果