NOIP信息学奥赛资料下载
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 4553 通过数: 1903
【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
【来源】
No
代码如下:
#include<iostream>
#include<cstring>
#define N 310
using namespace std;
string a,b;
int as[310],bs[310],ans[310],lena,lenb;
void jian(){
for(int i=0;i<lena;i++)as[i]-=bs[i];
for(int i=0;i<lena;i++)
{
if(as[i]<0){
as[i]+=10;
as[i+1]--;
}
}
while(as[lena-1]==0&&lena>0)lena--;
}
bool dx(){
if(lena>lenb)return true;
if(lena<lenb)return false;
for(int i=lena-1;i>=0;i--){
if(as[i]>bs[i])return true;
if(as[i]<bs[i])return false;
}
return true;
}
void jy(int k)
{
if(k==0)k=1;
if(k!=1)
{
for(int i=lenb-1;i>=0;i--)
{
bs[i+k-1]=bs[i];
bs[i]=0;
}
lenb+=k-1;
}
while(dx()==true){
jian();
ans[k-1]++;
int ls=k-1;
for(int i=k-1;i<=ls;i++)
{
if(ans[i]>9){
ans[i+1]++;
ans[i]-=10;
if(ans[i+1]>9)ls++;
}
}
}
if(k!=1)
{
for(int i=k-1;i<lenb;i++)
{
bs[i-k+1]=bs[i];
bs[i]=0;
}
lenb-=k-1;
}
}
int main(){
cin>>a>>b;
if(a==b){cout<<1<<endl<<0<<endl;return 0;}
lena=a.size();
lenb=b.size();
for(int i=0;i<lena;i++)as[i]=a[lena-i-1]-'0';
for(int i=0;i<lenb;i++)bs[i]=b[lenb-i-1]-'0';
memset(ans,0,sizeof(ans));
int k=lena-lenb;
if(k<0){cout<<0<<endl<<a<<endl;return 0;}
while(k>=0){
if(k==0&&dx()==false)break;
jy(k);
k=lena-lenb;
}
int h1=301,h2=301;
while(ans[h1]==0&&h1>0)h1--;
while(as[h2]==0&&h2>0)h2--;
for(int i=h1;i>=0;i--)cout<<ans[i];
cout<<endl;
for(int i=h2;i>=0;i--)cout<<as[i];
cout<<endl;
}