https://www.acmicpc.net/problem/4375

#include <stdio.h>

int main(void) {
    int n, c = 1;
    long long num = 1;


    while (~scanf("%d", &n)) { // EOF 입력입니다.
        num = 1;
        c = 1;
        while (1) {
            if (num % n != 0) {
                num = (num % n) * 10 + 1; //여기가 함정
                c++;
            }
            else {
                printf("%d\n", c);
                break;
            }
        }
    }
    return 0;
}

맨 처음에 문제만 보고 쉽다고 생각했는데, 함정이 있었습니다.

위에 보시면 제가
num = (num % n) * 10 + 1
이라고 적어놨는데요, 처음엔 이렇게 적지 않고
num = num * 10 + 1
이렇게 적었습니다. num이 1, 11, 111, 1111, 11111, ...... 이렇게 증가하면서 연산되길 바라면서요.

근데 출력이 안 되고 코드가 멈춰버리더라고요. 정수 오버플로우가 되는 것이었습니다.

9903을 넣으면 1이 3300자리가 나온다고 합니다.

ps 오픈채팅과 백준 질문글의 도움을 받았습니다.

아무튼
num = (num % n) * 10 + 1
이것을 사용하면 앞의 몫은 날아가고 나머지만 남는 것을 알 수 있습니다.
사실 몫은 필요가 없습니다. 한 번 나눠졌다면 몫에 어떤 자연수를 곱하던간에 또 나눠질게 뻔하니까요.

오늘은 참고하셔도 되겠습니다.

감사합니다.

+ Recent posts