정수 범위가 주어지고 범위에서 특수 숫자를 찾으라는 요청을 받았다고 가정합니다. 특수 숫자는 10진수 표현에서 1자리만 갖는 양의 정수인 숫자입니다. 10진수 표현에 1자리 이상의 숫자가 있는 숫자는 숫자가 10진수 표현의 자릿수로 나눌 수 있고 몫 값 자체가 특수 숫자인 경우에도 특수할 수 있습니다. 주어진 범위(left_limit, right_limit)에 있는 특수 숫자의 개수를 반환합니다.
따라서 입력이 left_limit =5, right_limit =30과 같으면 출력은 13이 됩니다.
이 범위의 특수 숫자는 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 24, 28입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- right_limit <10이면
- return right_limit - left_limit + 1
- len_right :=(right_limit)의 문자열 표현 크기
- 번호 목록 :=[0,1,2,3,4,5,6,7,8,9,10,12,14,16,18]
- 범위 2에서 len_right + 1까지의 j에 대해 다음을 수행합니다.
- number_list의 각 k에 대해 다음을 수행합니다.
- temp1 :=k * j
- temp1의 문자열 표현의 크기가 j와 같으면
- number_list 끝에 temp1 삽입
- 그렇지 않으면 len(str(temp1))> j, then
- 루프에서 나오다
- number_list[number_list의 크기 - 1]>=right_limit이면
- 루프에서 나오다
- number_list의 각 k에 대해 다음을 수행합니다.
- number_list에서 중복 값 삭제 및 정렬
- 카운트:=0
- number_list의 각 temp2에 대해 다음을 수행합니다.
- temp2>=left_limit 및 temp2 <=right_limit이면
- 카운트 :=카운트 + 1
- temp2>=left_limit 및 temp2 <=right_limit이면
- 반환 횟수
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def strange(left_limit, right_limit): if right_limit < 10: return right_limit - left_limit + 1 len_right = len(str(right_limit)) number_list = [0,1,2,3,4,5,6,7,8,9,10,12,14,16,18] for j in range(2, len_right + 1): for k in number_list: temp1 = k*j if len(str(temp1)) == j: number_list.append(temp1) elif len(str(temp1)) > j: break if number_list[len(number_list)-1] >= right_limit: break number_list = list(set(number_list)) count = 0 for temp2 in number_list: if temp2 >= left_limit and temp2 <= right_limit: count = count + 1 return count print(strange(5, 30))
입력
5, 30
출력
13