백준
[C언어] 백준 | 4375번 1
골드일
2022. 3. 29. 19:19
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
이것을 사용하면 앞의 몫은 날아가고 나머지만 남는 것을 알 수 있습니다.
사실 몫은 필요가 없습니다. 한 번 나눠졌다면 몫에 어떤 자연수를 곱하던간에 또 나눠질게 뻔하니까요.
오늘은 참고하셔도 되겠습니다.
감사합니다.