题目:
给两个正整数 a,b,求 a/b的整数部分。
输入格式:
输入共两行,每行一个正整数,分别表示 a和b。 50%数据,a,b均小于1e18, 50%数据,a,b均小于1e500。
输出格式:
输出一个整数,表示a/b的整数部分。
输入样例1:
3
2
输出样例1:
1
输入样例2
24781236498237462378425347823652387423654238752372365327862
8934457724628746
输出样例2:
2773669903874014740488146558678531750078864
高精度除法运算的实现:
结果表示为:商+余数
基本思路:
如,7546/23
7546先减23的100倍,减去3次,余646,商+1003;
646减23的10倍,减去2次,余186,商+102;
186减去23,减去8次,商+18。
最后的商为1003+102+18=328.
代码:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
string a,b;
int aa[550],bb[550],r[550];
void duiqi(int t[],int dd)
{
for(int i=1;i<=bb[0];i++)
t[i+dd-1]=bb[i];
t[0]=bb[0]+dd-1;
}
int duibi(int t[])
{
if (aa[0]>t[0]) return 1;
if (aa[0]<t[0]) return -1;
for (int i=aa[0]; i>0; i--){
if (aa[i]>t[i]) return 1;
if (aa[i]<t[i]) return -1;
}return 0;
}
int main()
{
int i,j,la,lb;
cin>>a>>b;
la=a.length();
lb=b.length();
if(la==lb)//先处理简单情况
{
if(a<b)//被除数<除数,商=0
{cout<<"0";return 0;}
if(a==b)//被除数=除数,商=1
{cout<<"1";return 0;}
}
else if(la<lb)//被除数<除数,商=0
{cout<<"0";return 0;}
aa[0]=la;
bb[0]=lb;
r[0]=aa[0]-bb[0]+1;
for(i=0;i<la;i++)
aa[la-i]=a[i]-'0';
for(i=0;i<lb;i++)
bb[lb-i]=b[i]-'0';
for(i=r[0];i>0;i--)
{
int t[550]={0};//需要每次都重置
duiqi(t,i);
while(duibi(t)>=0)
{
r[i]++;
for(j=1;j<=aa[0];j++)
{
if(aa[j]<t[j])
{
aa[j+1]--;
aa[j]+=10;
}
aa[j]-=t[j];
}
while(aa[aa[0]]==0)
aa[0]--;
}
}
while(r[0]>0&&r[r[0]]==0)
r[0]--;
for(i=r[0];i>0;i--)
cout<<r[i];
return 0;
}