1. 问题描述:
由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。这其中也有很多恰好是平方数(是某个数的平方)。比如:1026753849,就是其中最小的一个平方数。请你找出其中最大的一个平方数是多少?
输出
输出一个整数表示答案
来源:http://oj.ecustacm.cn/problem.php?id=1341
2. 思路分析:
分析题目可以知道我们需要生成0~9十个数字的全排列,因为使用的是python语言而且这道题目又是填空题所以可以直接使用python中itertools模块中的permutations()方法生成全排列(遍历permutations生成的全排列为元组类型,可以通过print语句输出变量的类型type(cur)),在for循环中判断当前的排列对应的十进制数字是否是平方数字即可,找到最大的那个平方数字即可。判断一个数字是否是平方数字可以通过对当前的数字开方之后取整然后再平方看是否等于原来的那个数字,如果相等说明当前的数字是平方数字。最终的答案是9814072356。其实也可以通过交换元素递归生成全排列的方法解决的,只是需要自己手写生成全排列的代码而已,每生成一个排列判断对应的十进制数字是否是平方数字即可。
3. 代码如下:
import math
import itertools
# 验证当前的数字是否是平方数
def solve(n: int):
t = int(math.sqrt(n))
if t * t == n: return True
return False
if __name__ == '__main__':
# 暴力破解即可
nums = [i for i in range(10)]
# 使用permutations方法生成全排列
permutations = itertools.permutations(nums)
for cur in permutations:
# 因为是从第一位开始计算的所以权重为10 ** 9
base = 10 ** 9
t = 0
# cur属于元组类型所以我们需要对元组中排列转换为对应的十进制数字, 可以通过type方法输出变量的数据类型
for n in cur:
t += n * base
base //= 10
if solve(t):
print(cur)
# break