# **a667. 可怕的除法**
---
**題目:**
計算高精度除法的商、餘數(模)。(被除數≥0,除數>0)
---
**輸入說明:**
輸入有多组測資(不多於11個)
每组測資有一行,第一個數為被除數,第二個數為除數。
---
**輸出說明:**
輸出被除數/除數和被除數%除數,中間空四個空格,詳細見範例。
---
**範例輸入 #1**
1212455 55555
5 6
---
**範例輸出 #1**
21 45800
0 5
---
**題目網址:**
https://zerojudge.tw/ShowProblem?problemid=a667
---
**解題紀錄:**
```cpp=
#include <bits/stdc++.h>
using namespace std;
struct Number {
short nums[1270], len;
}number[3];
inline void Init(string s, int x) {
number[x].len = s.size();
for (int i = s.size()-1, j = 0; i >= 0; i--, j++)
number[x].nums[j] = s[i]-'0';
}
inline void borrow_digit(short n[], short &d) {
for (int i = 0; i < d-1; i++) {
if (n[i] < 0) {
n[i] += 10;
n[i+1]--;
}
}
while ((d > 1) && n[d-1] == 0)
d--;
return;
}
inline bool isBigger(int shift_amounts) {
if (number[0].len != (number[1].len+shift_amounts))
return (number[0].len > number[1].len+shift_amounts ? 1 : 0);
for (int i = number[0].len-1; i >= 0; i--) {
if (number[0].nums[i] > number[1].nums[i-shift_amounts])
return 1;
else if (number[0].nums[i] < number[1].nums[i-shift_amounts])
return 0;
}
return 1;
}
inline void MulByTen(short n[], short &d) {
for (int i = d; i > 0; i--) {
n[i] = n[i-1];
}
n[0] = 0;
d++;
return;
}
inline void sub(int shift_amounts) {
for (int i = number[1].len-1; i >= 0; i--) {
number[0].nums[i+shift_amounts] -= number[1].nums[i];
}
borrow_digit(number[0].nums, number[0].len);
return;
}
inline void divider() {
int shift_right(0), k;
bool check(0);
while (number[0].len > (number[1].len+shift_right))
shift_right++;
k = max(shift_right+1, 1);
for (int i = 0; i < k; i++) {
if (check)
MulByTen(number[2].nums, number[2].len);
while (isBigger(shift_right)) {
check = 1;
sub(shift_right);
number[2].nums[0]++;
if (number[0].nums[number[0].len-1] < 0)
break;
}
shift_right--;
}
return;
}
int main() {
string a, b;
while (cin >> a >> b) {
for (int i = 0; i < 3; i++) {
memset(number[i].nums, 0, sizeof(number[i].nums));
number[i].len = 0;
}
number[2].len++;
Init(a, 0), Init(b, 1);
divider();
for (int i = number[2].len-1; i >= 0; i--)
putchar(number[2].nums[i]+'0');
for (int i = 0; i < 4; i++)
putchar(' ');
for (int i = number[0].len-1; i >= 0; i--)
putchar(number[0].nums[i]+'0');
putchar('\n');
}
return 0;
}
```