큰 숫자가 제공되고 해당 숫자의 자릿수가 8로 나누어 떨어지는 순열이 있는지 확인해야 한다고 가정합니다. 숫자는 문자열 형식으로 제공됩니다.
따라서 입력이 input_num =4696984와 같으면 출력은 "8로 나눌 수 있음"이 됩니다.
이 문제를 해결하기 위해 숫자의 자릿수로 가능한 모든 세 자리 순열을 확인하고 숫자의 모든 자릿수 순열에서 발생할 수 있는지 확인합니다. 8로 나눌 수 있는 세 자리 순열이 숫자의 모든 자리 순열 끝에 발생하면 순열을 8로 나눌 수 있다고 말합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- input_num의 길이가 <3이면
- input_num mod 8이 0과 같으면
- 참 반환
- input_num :=input_num의 반대
- input_num mod 8이 0과 같으면
- 참 반환
- 거짓을 반환
- input_num mod 8이 0과 같으면
- temp_arr :=0으로 초기화된 크기 10의 새 목록입니다.
- 0~input_num 크기 범위의 개수에 대해
- temp_arr[input_num[count] - 0] :=temp_arr[input_num[count] - 0] + 1
- 104 ~ 999 범위의 카운트의 경우 8만큼 증가, do
- temp :=count
- occurences :=0으로 초기화된 크기 10의 새 목록입니다.
- 발생 횟수[temp mod 10] :=발생 횟수[temp mod 10] + 1
- temp :=온도 / 10
- 발생 횟수[temp mod 10] :=발생 횟수[temp mod 10] + 1
- temp :=온도 / 10
- 발생 횟수[temp mod 10] :=발생 횟수[temp mod 10] + 1
- temp :=count
- 발생[temp mod 10]> temp_arr[temp mod 10]이면
- 다음 반복으로 이동
- temp :=온도 / 10
- 발생[temp mod 10]> temp_arr[temp mod 10]이면
- 다음 반복으로 이동
- temp :=온도 / 10
- 발생[temp mod 10]> temp_arr[temp mod 10]이면
- 다음 반복으로 이동
- 참 반환
- 거짓을 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
def solve(input_num): if len(input_num) < 3: if int(input_num) % 8 == 0: return True input_num = input_num[::-1] if int(input_num) % 8 == 0: return True return False temp_arr = 10 * [0] for count in range(0, len(input_num)): temp_arr[int(input_num[count]) - 0] += 1 for count in range(104, 1000, 8): temp = count occurences = 10 * [0] occurences[int(temp % 10)] += 1 temp = temp / 10 occurences[int(temp % 10)] += 1 temp = temp / 10 occurences[int(temp % 10)] += 1 temp = count if (occurences[int(temp % 10)] > temp_arr[int(temp % 10)]): continue temp = temp / 10 if (occurences[int(temp % 10)] > temp_arr[int(temp % 10)]): continue temp = temp / 10 if (occurences[int(temp % 10)] > temp_arr[int(temp % 10)]): continue return True return False if solve("4696984"): print("Divisible by eight") else: print("Not divisible by eight")
입력
4696984
출력
Divisible by eight