큰 숫자가 제공되고 해당 숫자의 자릿수가 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