2 ≤ n ≤ 1018 및 2 ≤ m ≤ n과 같은 두 개의 양의 정수 n과 m이 있다고 가정합니다. 우리의 목표는 숫자 n의 모든 숫자 순열이 있는지 알아내는 것입니다. 그래서 그것은 m의 어떤 거듭제곱과 같습니다. 하나가 있는 경우 m의 거듭제곱과 동일한 n의 모든 숫자 순열이 존재한다고 명시하고, 그렇지 않으면 이전 진술을 거짓으로 명시합니다.
예를 들어, n =7182 및 m =12가 주어집니다. 1728은 7182 및 1728 =12^3의 모든 자릿수 순열이므로 n의 모든 자릿수 순열은 m의 거듭제곱과 같습니다. .
따라서 입력이 n=7182와 같으면 m =12입니다. 그러면 출력은 "n의 모든 자릿수 순열은 m의 거듭제곱과 같습니다."가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- check_power() 함수를 정의합니다. 이것은 n, m
- 이 걸립니다.
- temp_arr_1 :=새 목록
- temp_arr_2 :=새 목록
- n> 0일 때 수행
- temp_arr_1 끝에 (n mod 10) 삽입
- n :=n / 10의 하한값
- m> 0일 때 수행
- temp_arr_2 끝에 (m mod 10) 삽입
- m :=m / 10의 하한값
- temp_arr_1의 새 집합이 temp_arr_2의 새 집합과 같으면
- 참 반환
- 거짓을 반환
- 메인 방법에서 다음을 수행하십시오 -
- power_array :=0으로 초기화된 크기 100의 새 목록입니다.
- 최대 범위 :=10^18
- power_array[0] :=m
- i :=1
- 동안 (power_array[i - 1] * m)
- power_array[i] :=power_array[i - 1] * m
- 나는 :=나는 + 1
- check_power(n, power_array[j])가 True이면
- return "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