[C] 1271번: 엄청난 부자2

[C] 1271번: 엄청난 부자2
2026-03-07

문제#

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

갑부 최백준 조교는 동전을 최소로 바꾸는데 성공했으나 김재홍 조교가 그 돈을 발견해서 최백준 조교에게 그 돈을 나누자고 따진다.

그 사실이 전 우주로 알려지자 우주에 있던 많은 생명체들이 자신들에게 돈을 분배해 달라고 당장 달려오기 시작했다.

프로토스 중앙 우주 정부의 정책인, ‘모든 지적 생명체는 동등하다’라는 규칙에 입각해서 돈을 똑같이 분배하고자 한다.

한 생명체에게 얼마씩 돈을 줄 수 있는가?

또, 생명체들에게 동일하게 분배한 후 남는 돈은 얼마인가?

입력#

첫째 줄에는 최백준 조교가 가진 돈 n과 돈을 받으러 온 생명체의 수 m이 주어진다. (1 ≤ m ≤ n ≤ 101000, m과 n은 10진수 정수)

출력#

첫째 줄에 생명체 하나에게 돌아가는 돈의 양을 출력한다. 그리고 두 번째 줄에는 1원씩 분배할 수 없는 남는 돈을 출력한다.

풀이#

입력 범위가 매우 커서 일반 정수형으로 처리할 수 없습니다.

C에는 자바의 BigInteger 같은 기능이 없으므로, 문자열로 큰 수를 입력받아 긴 나눗셈을 직접 구현해야 합니다.

왼쪽부터 한 자리씩 내려오면서 현재 값을 만들고, 그 값에서 divisor를 뺄 수 있을 만큼 빼서 몫의 각 자릿수를 구하면 됩니다.

코드#

#include <stdio.h>
#include <string.h>
#define MAX 1001
void normalize(const char *src, char *dst) {
int i = 0;
while (src[i] == '0' && src[i + 1] != '\0') {
i++;
}
strcpy(dst, src + i);
}
int compare_num(const char *a, const char *b) {
int len_a = strlen(a);
int len_b = strlen(b);
if (len_a > len_b) return 1;
if (len_a < len_b) return -1;
int cmp = strcmp(a, b);
if (cmp > 0) return 1;
if (cmp < 0) return -1;
return 0;
}
void subtract_num(const char *a, const char *b, char *result) {
char temp[MAX];
int len_a = strlen(a);
int len_b = strlen(b);
int i = len_a - 1;
int j = len_b - 1;
int k = 0;
int borrow = 0;
while (i >= 0 || j >= 0) {
int da = (i >= 0 ? a[i] - '0' : 0) - borrow;
int db = (j >= 0 ? b[j] - '0' : 0);
if (da < db) {
da += 10;
borrow = 1;
} else {
borrow = 0;
}
temp[k++] = (da - db) + '0';
i--;
j--;
}
while (k > 1 && temp[k - 1] == '0') {
k--;
}
for (int t = 0; t < k; t++) {
result[t] = temp[k - 1 - t];
}
result[k] = '\0';
}
void divide_bigint(const char *dividend, const char *divisor, char *quotient, char *remainder) {
char rem[MAX] = "0";
char temp[MAX];
char q[MAX];
int qlen = 0;
for (int i = 0; dividend[i] != '\0'; i++) {
int len_rem = strlen(rem);
if (strcmp(rem, "0") == 0) {
rem[0] = dividend[i];
rem[1] = '\0';
} else {
rem[len_rem] = dividend[i];
rem[len_rem + 1] = '\0';
}
normalize(rem, temp);
strcpy(rem, temp);
int digit = 0;
while (compare_num(rem, divisor) >= 0) {
subtract_num(rem, divisor, temp);
strcpy(rem, temp);
digit++;
}
q[qlen++] = digit + '0';
}
q[qlen] = '\0';
normalize(q, quotient);
strcpy(remainder, rem);
}
int main() {
char n[MAX], m[MAX];
char quotient[MAX], remainder[MAX];
scanf("%s %s", n, m);
divide_bigint(n, m, quotient, remainder);
printf("%s\n", quotient);
printf("%s\n", remainder);
return 0;
}