반응형
이번 문제는 특별한 알고리즘이 있는 것은 아니고, 그냥 지시한대로 구현을 하면 되는 문제입니다.
제가 다른 사람들한테 자주 물어본 수학 문제는 이런것이었습니다.
1000! (천 팩토리얼)을 계산하면 아주 큰 수가 나올거야. 그 수의 모든 자릿수를 다 더하면, 하나의 수가 되겠지. 이것을 계속 반복하면 결국 한자리 수가 나올텐데, 그 답은?
답은 당연하겠지만 9입니다.
3차리 수라고 하면, \(100a + 10b + c\)로 표현할 수 있습니다. 이것을 다시 분해하면, \(99a + 9b + a + b + c\)로 표현할 수 있죠. \(10^k - 1 \)은 9의 배수이므로, 주어진 3자리수가 9의 배수이면, \(a + b + c\)도 9의 배수가 됩니다. 팩토리얼은 6! 부터 9의 배수가 됩니다.
결국 자릿수를 다 더하는 로직을 계산한 것인데, 우선 백만자리가 넘지 않는 수이므로 처음 다 더하면, 최대 수는 9백만이 됩니다. 그러므로 그 다음부터는 int형으로 계산해도 되죠. 9백만이란 숫자이면 7자리이므로 그 다음수는 63 미만의 수가 되죠. 금방 두자리 수자가 되는 것을 알 수 있습니다. 즉, 반복횟수가 극히 짧습니다.
제가 작성한 소스입니다. 소스는 참고용으로 봐주세요.
//-------------------------------------------------
// baekjoon #1769
// - by Aubrey Choi
// - created at 2019-08-09
//-------------------------------------------------
#include <stdio.h>
int main()
{
int r=0, c=0;
for(;;c++)
{
int ch=getchar();
if(ch<'0'||ch>'9') break;
r += ch-'0';
}
c=c>1?1:0;
for(;r>=10;c++)
{
int t=0;
while(r) t+=r%10,r/=10;
r=t;
}
printf("%d\n%s\n",c,r%3?"NO":"YES");
return 0;
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1786 찾기(KMP) (0) | 2022.10.21 |
---|---|
[C/C++] 백준 #1780 종이의 개수(분할정복) (0) | 2022.10.20 |
[C/C++] 백준 #1766 문제집(위상정렬) (2) | 2022.10.15 |
[C/C++] 백준 #1764 듣보잡(집합자료) (0) | 2022.10.15 |
[C/C++] 백준 #1761 정점들의 거리(최소 공통 조상) (0) | 2022.10.11 |
댓글