1308:【例1.5】高精除
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 16005 通过数: 7852
【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
#include<bits/stdc++.h>
using namespace std;
void read(int a[]){
string s;
cin>>s;
a[0]=s.size();
for(int i=1;i<=a[0];i++)a[i]=s[a[0]-i]^48;
while(!a[a[0]]&&a[0]>1)a[0]--;
}
bool cmp(int a[],int b[],int p){
if(a[0]-p+1>b[0])return true;
if(a[0]-p+1<b[0])return false;
for(int i=a[0],j=b[0];i>=p;i--,j--){
if(a[i]>b[j])return true;
if(a[i]<b[j])return false;
}
return true;
}
void sub(int a[],int b[],int p){
for(int i=p,j=1;i<=a[0];i++,j++){
a[i]-=b[j];
if(a[i]<0){
a[i+1]--;
a[i]+=10;
}
}
while(!a[a[0]]&&a[0]>1)a[0]--;
}
void div(int a[],int b[],int c[]){
memset(c,0,sizeof(c));
c[0]=a[0];
for(int i=c[0];i;i--){
while(cmp(a,b,i)){
sub(a,b,i);
c[i]++;
}
}
while(!c[c[0]]&&c[0]>1)c[0]--;
}
void write(int a[]){
for(int i=a[0];i;i--)cout<<a[i];
}
int a[305],b[305],c[305];
int main(){
read(a);
read(b);
div(a,b,c);
write(c);
cout<<endl;
write(a);
return 0;
}