本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。

输入格式:

输入在一行中依次给出 AB,中间以 1 空格分隔。

输出格式:

在一行中依次输出 QR,中间以 1 空格分隔。

输入样例:

  1. 123456789050987654321 7

输出样例:

  1. 17636684150141093474 3

思路

大整数加减乘除要用结构体去实现手算的过程。

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. struct BigNumber {
  4. int number[1001];
  5. int length;
  6. BigNumber() { /* 构造函数,给成员赋初值 */
  7. length = 0;
  8. memset(number, 0, sizeof(number));
  9. }
  10. };
  11. BigNumber change(char*); /* 将字符串转换成BigNumber对象的函数 */
  12. BigNumber divide(BigNumber, int, int&);
  13. int main() {
  14. char input1[1001];
  15. int B;
  16. scanf("%s%d", input1, &B);
  17. int remainder = 0;
  18. BigNumber A = change(input1);
  19. BigNumber result = divide(A, B, remainder);
  20. /** 输出BigNumber对象 */
  21. for(int i = result.length - 1; i >= 0; i--) {
  22. printf("%d", result.number[i]);
  23. }
  24. printf(" %d", remainder);
  25. return 0;
  26. }
  27. /******************函数实现***************************/
  28. BigNumber change(char* input) {
  29. BigNumber result;
  30. result.length = strlen(input);
  31. for(int i = 0; i < result.length; i++) {
  32. result.number[i] = input[result.length - 1 -i] - '0';
  33. }
  34. return result;
  35. }
  36. BigNumber divide(BigNumber a, int b, int& remainder) {
  37. BigNumber result;
  38. result.length = a.length;
  39. for(int i = a.length - 1; i >= 0; i--) {
  40. remainder = remainder * 10 + a.number[i]; /* 和上一位遗留的余数组合 */
  41. if(remainder < b) { /* 不够除,该位为0 */
  42. result.number[i] = 0;
  43. }
  44. else { /* 够除 */
  45. result.number[i] = remainder / b; /* 商 */
  46. remainder = remainder % b; /* 计算新的余数 */
  47. }
  48. }
  49. while(result.length - 1 >= 1 && result.number[result.length - 1] == 0) {
  50. result.length--; /* 去除高位的0,同时至少保留一位最低位 */
  51. }
  52. return result;
  53. }