2737:大整数除法

原题:http://bailian.openjudge.cn/practice/2737/

描述

求两个大的正整数相除的商。

输入

第1行是被除数,第2行是除数。每个数均不超过100位。

输出

一行,相应的商的整数部分

样例输入

2376
24

样例输出

99

解法

相较于大整数的加法、减法、乘法,更难一点,思路是依据于计算机体系结构中除法器的实现,只是体系结构中的是二进制所以减一次就可以,但是这里是十进制需要减很多次而且进行大小比较。核心:移位、相减

坑:经过一段时间的WA,主要发现两个坑

(1)题目中说了是正整数,所以不会像前面几个一样出现0作为计算数的情况,但是没说没有前导零,特别是用这种移位相减的方法时,位数很关键,应该先去除前导0,不然1/ 01就挂了。

(2)按照前三个(加法、减法、乘法)的做法,最后需要去除前导0,但是题目中没有说被除数一定大于除数,所以答案为0的情况也会出现。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int factora[105] = {};
 5 int factorb[105] = {};
 6 int dif[205] = {};
 7 int cnt1, cnt2;
 8 int* sub(int *a,int *b)
 9 {
10     for (int i = 0; i < cnt1; i++) {
11         if (a[i] < b[i]) {
12             a[i + 1]--;
13             a[i] = a[i] + 10;
14         }
15         dif[i] = a[i] - b[i];
16     }
17     return dif;
18 }
19 bool test(int *a, int *b)
20 {
21     for (int j = cnt1-1; j >= 0; j--)
22     {
23         if (a[j] > b[j])
24             return true;
25         if (a[j] < b[j])
26             return false;
27     }
28     return true;
29 }
30 int main()
31 {
32     int result[105] = {};
33     memset(dif, 0, sizeof(dif));
34     cnt1 = 0;
35     cnt2 = 0;
36     char inputa[200];
37     char inputb[200];
38     cin >> inputa;
39     cin >> inputb;
40     cnt1 = strlen(inputa);
41     cnt2 = strlen(inputb);
42     //去除前导0
43     int nozero1, nozero2;
44     for(int i=0;i<cnt1;i++)
45         if (inputa[i] != '0') {
46             nozero1 = i;
47             break;
48         }
49     for(int i=0;i<cnt2;i++)
50         if (inputb[i] != '0') {
51             nozero2 = i;
52             break;
53         }
54     cnt1 -= nozero1;
55     for (int i = 0; i < cnt1; i++) {
56         inputa[i] = inputa[i + nozero1];
57     }
58     cnt2 -= nozero2;
59     for (int i = 0; i < cnt2; i++)
60         inputb[i] = inputb[i + nozero2];
61     //准备移位相减,temp是每次减后的结果
62     for (int i = 0; i < cnt1; i++)
63         factora[cnt1 - 1 - i] = inputa[i] - '0';
64     int *temp = factora;
65     for (int j = 0; j <= cnt1 - cnt2; j++) {
66         memset(factorb, 0, sizeof(factorb));
67         for (int i = 0; i < cnt2; i++)
68             factorb[cnt1 - 1 - j - i] = inputb[i] - '0';
69         while (test(temp, factorb))
70         {
71             result[cnt1 - cnt2 - j]++;
72             temp = sub(temp, factorb);
73         }
74     }
75     int j;
76     for (j = cnt1 - 1; j >= 0; j--)
77     {
78         if (result[j] > 0)
79             break;
80     }
81     if (j == -1)
82         j = 0;
83     for (int i = j; i >= 0; i--)
84         cout << result[i];
85     return 0;
86 }

 

posted @ 2021-07-05 09:42  永远是个小孩子  阅读(422)  评论(0)    收藏  举报