ascode 1089 3n+1 문제
문제 설명
임의의 양의 정수 n에 대하여 그 값이 홀수이면 3*n+1로 계산하고, 짝수이면 2로 나누는 과정을 결과값이 1이 될 때까지 반복할 경우 n부터 1이 될 때까지 생성된 수열의 길이(항의 개수)를 m이라고 하자.
예를 들어, n이 22인 경우 이 규칙에 따라 생성되는 수열은 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 이며 이때 m은 16이 된다.
임의의 양의 정수 i, j 가 주어질 때 i와 j 사이(i, j 포함)에 포함된 모든 정수들로 각각 m을 계산하였을 때, 가장 큰 값의 m과 가장 작은 값의 m을 나란히 출력하는 프로그램을 작성하자.
입력 설명
첫 줄에는 테스트 케이스 수 T가 입력된다.(1 <= T <= 10) 다음 줄부터 T개의 양의 정수i, j (1 <= i, j <= 100,000) 가 입력된다.
출력 설명
입력된 각 테스트 케이스 별로 가장 큰 m과 가장 작은 m을 하나의 공백으로 구분하여 한 줄에 하나씩 출력한다.
입력 예시
2
10 1
100 200
출력 예시
20 1
125 8
코드
#include <stdio.h>
int main()
{
int a,b,c,d = 0,e,f,temp = 0,count = 1,arr[100000];
scanf("%d", &a);
for (int i = 0; i < a; i++)
{
scanf("%d %d", &b, &c);
if (b > c) { e = c; f = b; }
else { e = b; f = c;}
for (int i = e; i <= f; i++)
{
temp = i;
for (;;) {
if (temp == 1) {
break;
}
if ((temp % 2) == 0) {
temp = temp / 2;
count++;
}
else if ((temp % 2) != 0) {
temp = temp * 3 + 1;
count++;
}
}
arr[d] = count;
d++;
count = 1;
}
temp = 0;
for (int i = 0; i <= d - 1; i++)
{
for (int j = 0; j < d - 1 - i; j++)
{
if (arr[j] < arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("%d %d\n", arr[0], arr[d - 1]);
temp = 0;
d = 0;
}
}
나 : say
이거 짱 쪼금 힘들었당
댓글남기기