Time Limit: 1 second
Memory Limit: 2 MB问题描述输入两个高精度非0整数,输出它们的整数商(不考虑小数部分)。
Input
输入只有两行,第一行一个整数x,第二行一个整数y。其中0<=x<=10^200,0<=y<=10^200
Output
输出有1行,为两个数的整数商。
Sample Input
222222222233333333333333333333222222222222222222222222222222
Sample Output
1(换行)
【题解】
思路是,将除数一开始加上n个0,然后不断地用这个去减被除数。减了几次c[n]就为几。然后n--,即除数再除10,然后再用除数去减被除数。减了几次c[n-1]就为几。
其中涉及到高精度的比较,高精度减法等内容。
【代码】
#include#include #include #include using namespace std;int a[400],b[400],c[400];void input_data(int a[]) //用一个输入过程。调用两次 就可以读入两个数字了。{ string s1; cin >> s1; a[0] = s1.size(); for (int i = 1;i <= a[0];i++) //逆序存入a数组 a[0]用来存数字的长度 a[i] = s1[a[0]-i] - '0';}bool can(int a[],int b[]) //判断a是否能被b减。如果能返回true{ if (a[0] > b[0]) return true; if (a[0] < b[0]) return false; //先由长度判断 for (int i = a[0];i >= 1;i--)//再根据具体的每一位来判断. { if (a[i] > b[i]) return true; if (a[i] < b[i]) return false; } return true; }void numcp(int a[],int b[],int w) //把a数组赋值给b数组,其中w表示a数字乘了10^w{ for (int i = 1;i <= a[0];i++) b[w+i-1] = a[i]; b[0] = a[0] + w - 1; }void jianfa(int a[],int b[]) //做高精度减法,用a减去b{ for (int i = 1;i <= a[0];i++) { if (a[i] < b[i]) { a[i+1]--; a[i]+=10; } a[i] = a[i] - b[i]; } while (a[0] > 1 && a[a[0]] == 0) a[0]--; //去掉前导0}void gaojingdu(int a[],int b[],int c[]) //高精度除法主程序{ int temp[200]; int lenc = a[0]-b[0] + 1; //这是获取最多乘10的多少次方 同时也是答案数组的长度 可以手算模拟一下. for (int i = lenc;i >= 1;i--) { memset(temp,0,sizeof(temp)); //temp数组归0 numcp(b,temp,i);//把b*10^i 赋值给temp数组 while (can(a,temp)) //不断地减,然后这个位上的答案递增. { jianfa(a,temp); c[i]++; } } while (lenc > 1 && c[lenc] == 0) //去掉前导0 lenc--; c[0] = lenc; //把答案数字的长度赋值给c[0]}void output_ans(){ for (int i = c[0];i >= 1;i--) //打印答案 printf("%d",c[i]); if (c[0] <= 0) //像是1 / 22222222 这样,lenc = 一个负数。这个时候答案直接输出0就好了。 printf("0");}int main(){ input_data(a); input_data(b); gaojingdu(a,b,c); output_ans(); return 0; }