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 }

浙公网安备 33010602011771号