假设,我们有两个正整数 n 和 m,使得 2 ≤ n ≤ 1018 和 2 ≤ m ≤ n。我们的目标是找出数字 n 是否存在任何全数字排列;所以它等于 m 的某个幂。如果有,我们就说存在一个 n 的全数字排列,它等于 m 的一次幂,否则我们说之前的陈述为假。
例如,给定 n = 7182 和 m = 12。由于 1728 是 7182 和 1728 = 12^3 的全数排列,我们声明 n 的全数排列等于 m 的幂.
所以,如果输入像 n=7182,m=12;那么输出将是“n 的所有数字排列等于 m 的幂”。
为了解决这个问题,我们将按照以下步骤操作 -
定义一个函数check_power()。这将需要 n, m
返回真
在 temp_arr_2 的末尾插入 (m mod 10)
m := m / 10 的底值
在 temp_arr_1 的末尾插入 (n mod 10)
n := n / 10 的底价
temp_arr_1 := 一个新列表
temp_arr_2 := 一个新列表
当 n > 0 时,做
当 m > 0 时,做
如果来自 temp_arr_1 的新集合与来自 temp_arr_2 的新集合相同,则
返回错误
从主要方法执行以下操作 -
power_array := 大小为 100 的新列表,初始化为 0。
最大范围:= 10^18
power_array[0] := m
我:= 1
而 (power_array[i - 1] * m) < max_range,做
power_array[i] := power_array[i - 1] * m
我 := 我 + 1
对于 0 到 i 范围内的 j,执行
return "n 的所有数字排列等于 m 的幂"
如果 check_power(n, power_array[j]) 为 True,则
返回“并非所有 n 的数字排列都等于 m 的幂”
让我们看看以下实现以获得更好的理解 -
def check_power(n, m): temp_arr_1 = [] temp_arr_2 = [] while (n > 0) : temp_arr_1.append(n % 10) n //= 10 while (m > 0) : temp_arr_2.append(m % 10) m //= 10 if (set(temp_arr_1) == set(temp_arr_2)): return True return False def solve(n, m): power_array = [0] * 100 max_range = pow(10, 18) power_array[0] = m i = 1 while (power_array[i - 1] * m < max_range) : power_array[i] = power_array[i - 1] * m i += 1 for j in range(i): if (check_power(n, power_array[j])) : return "An all digit-permutation of n is equal to a power of m" return "No all digit-permutation of n is equal to a power of m" n, m = 7182, 12 print(solve(n, m))
7182, 12输出结果
An all digit-permutation of n is equal to a power of m