# **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; } ```