어떤 정수 n에서 시작해, n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다. 이렇게 해서 새로 만들어진 숫자를 n으로 놓고, n=1 이 될때까지 같은 작업을 계속 반복한다. 예를 들어, n=22이면 다음과 같은 수열이 만들어진다.
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
n이라는 값이 입력되었을때 1이 나올때까지 만들어진 수의 개수(1을 포함)를 n의 사이클 길이라고 한다. 위에 있는 수열을 예로 들면 22의 사이클 길이는 16이다. i와 j라는 두개의 수가 주어졌을때, i와 j사이의 모든 수(i, j포함)에 대해 최대 사이클 길이를 구하라.
입력 예
1 10
100 200
201 210
900 1000
출력 예
1 10 20
100 200 125
201 210 89
900 1000 174
# 1. 어떤 정수 n에서 시작해, n 이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다.
# 2. 1번 동작을 계속 실행하여 1이 될때까지 같은 작업을 반복하고 반복 횟수를 저장
# 3. 입력된 두 수 범위에 있는 각 수를 1,2 번을 실행 하고, 최대 반복 횟수를 저장한다.
a,b = map(int, input().split())
max_count = 0
for i in range(a,b):
count = 1
while i!=1:
if i%2 == 0:
i /= 2
else:
i = i*3 +1
count +=1
if max_count < count:
max_count=count
print(a,b,max_count)
어떤 정수 n에서 시작해, n 이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다.
if i%2 == 0:
i /= 2
else:
i = i*3 +1
1번 동작을 계속 실행하여 1이 될때까지 같은 작업을 반복하고 반복 횟수를 저장
count = 1
while i!=1:
if i%2 == 0:
i /= 2
else:
i = i*3 +1
count +=1
입력된 두 수 범위에 있는 각 수를 1,2 번을 실행 하고, 최대 반복 횟수를 저장한다.
a,b = map(int, input().split())
max_count = 0
for i in range(a,b):
count = 1
while i!=1:
if i%2 == 0:
i /= 2
else:
i = i*3 +1
count +=1
if max_count < count:
max_count=count
print(a,b,max_count)
def cypro(k):
cl=1
while k != 1:
if k%2==0:
k=k/2
cl+=1
else:
k=3*k+1
cl+=1
return cl
i=int(input('INPUT MIN NUM : '))
j=int(input('INPUT MAX NUM : '))
t=0
arw=[]
for t in range(i,j+1):
arw.append(cypro(t))
print(max(arw))
크게 어려운 문제가 아니여서 기본적인 틀은 같지만 리스트에 각각 저장해 가장큰 값을 불러오는가 아님 변수를 사용하여 큰값을 저장하는가 차이인것 같다. 리스트에 저장하면 나중에 어떤 숫자가 몇번 반복되었는지 알수 있어서 더 좋긴 할거 같으며 함수를 사용하여 더 가독성 좋아졌다.