#include <stdio.h>
int main(void) {
int n = 0;
int sum = 0;
char str[101];
scanf("%d%100s", &n, str);
for(int i = 0; i < n; i++) {
sum += str[i] -48;
}
printf("%d", sum);
}
100자리의 문자열 만들어주시고,
scanf로 입력 받은 다음
미리 n을 입력받아서 몇자리인지 확인이 되어있기 때문에 for문으로 0번째부터 n - 1 번째 배열에 있는 수를 전부 더해주면 됩니다.
#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 이것을 사용하면 앞의 몫은 날아가고 나머지만 남는 것을 알 수 있습니다. 사실 몫은 필요가 없습니다. 한 번 나눠졌다면 몫에 어떤 자연수를 곱하던간에 또 나눠질게 뻔하니까요.