ascode 1089 3n+1 문제

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

이거 짱 쪼금 힘들었당

댓글남기기