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
이것을 사용하면 앞의 몫은 날아가고 나머지만 남는 것을 알 수 있습니다.
사실 몫은 필요가 없습니다. 한 번 나눠졌다면 몫에 어떤 자연수를 곱하던간에 또 나눠질게 뻔하니까요.
오늘은 참고하셔도 되겠습니다.
감사합니다.
'백준' 카테고리의 다른 글
[C언어] 백준 | 24228번 젓가락 (0) | 2022.04.01 |
---|---|
[C언어] 백준 | 11057번 오르막 수 (0) | 2022.03.31 |
[C언어] 백준 | 11720번 숫자의 합 (0) | 2022.03.30 |
[C언어] 백준 | 1051번 숫자 정사각형 (0) | 2022.03.27 |
[C언어] 백준 | 2164번 카드2 (0) | 2022.03.26 |