Time Limit: 1 second
Memory Limit: 2 MB
问题描述 输入两个高精度非0整数,输出它们的整数商(不考虑小数部分)。
Input
输入只有两行,第一行一个整数x,第二行一个整数y。其中0<=x<=10^200,0<=y<=10^200
Output
输出有1行,为两个数的整数商。
Sample Input
222222222233333333333333333333 222222222222222222222222222222
Sample Output
1(换行)
【题解】
思路是,将除数一开始加上n个0,然后不断地用这个去减被除数。减了几次c[n]就为几。然后n--,即除数再除10,然后再用除数去减被除数。减了几次c[n-1]就为几。
其中涉及到高精度的比较,高精度减法等内容。
【代码】
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
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;
}