题目描述
高精除以高精,求它们的商和余数。
代码在此
#include<bits/stdc++.h>
using namespace std;
string int_to_string(int a)
{
string c="";
c+=char(a+48);
return c;
}
int bijiao(string a1,string b1)//a1>b1返回1,a1<b1返回-1,相等返回0
{
//cout<<"进入比较\n";
if(a1.length()>b1.length())return 1;
else if(a1.length()<b1.length())return -1;
else
{
for(int i=0;i<max(a1.length(),b1.length());i++)
{
if(b1[i]>a1[i])
{
return -1;
}
if(b1[i]<a1[i])
{
return 1;
}
}
return 0;
//cout<<"完成比较\n";
}
}
string jian(string a1,string b1)
{
//cout<<"进入减法\n";
//1
string end="";
int a[300],b[300],c[300],n=0,g=0;//一定是a-b; n代表最长长度
bool x=0,out=0;//0正(a大)1负 (b大)
x=0;
if(b1.length()>a1.length())
{
x=1;
}
else if(b1.length()<a1.length())
{
x=0;
}
else if(b1.length()==a1.length())
{
for(int i=0;i<a1.length();i++)
{
if(b1[i]>a1[i])
{
x=1;
break;
}
else if(b1[i]<a1[i])
{
x=0;
break;
}
}
}
//cout<<"减法:完成比较";
//2
if(x==0)
{
g=0;
for(int i=a1.length()-1;i>=0;i--)
{
a[g]=a1[i]-48;
g++;
}
g=0;
for(int i=b1.length()-1;i>=0;i--)
{
b[g]=b1[i]-48;
g++;
}
n=a1.length();
}
else
{
g=0;
for(int i=b1.length()-1;i>=0;i--)
{
a[g]=b1[i]-48;
g++;
}
g=0;
for(int i=a1.length()-1;i>=0;i--)
{
b[g]=a1[i]-48;
g++;
}
g=0;
n=b1.length();
}
//cout<<"减法:完成转换\n";
for(int i=0;i<n;i++)//减法主体
{
if(a[i]-b[i]<0)
{
a[i+1]-=1;
c[i]=a[i]-b[i]+10;
}
else
{
c[i]=a[i]-b[i];
}
}
if(x==1)end+='-';
out=0;
for(int i=n-1;i>=0;i--)
{
if(c[i]!=0)
{
out=1;
break;
}
}
//cout<<"减法:完成运算\n";
if(out==0)return "0";
out=0;
for(int i=n-1;i>=0;i--)
{
if(c[i]!=0)out=1;
if(out==1)end+=char(c[i]+48);
//cout<<c[i];
}
//cout<<end;
//cout<<a1<<"-"<<b1<<"="<<end<<" x="<<x<<endl;
return end;
}
string jia(string a1,string b1)
{
//2
//cout<<"调用成功"<<a1<<" "<<b1;
int a[2002],b[2002],c[2002],n=0;// n代表最长长度
bool x=0,out=0;//0正(a大)1负 (b大)
out=0;
n=max(a1.length(),b1.length());
for(int i=0;i<=2001;i++)
{
a[i]=0;
b[i]=0;
c[i]=0;
}
string end="";
int g=0;
for(int i=a1.length()-1;i>=0;i--)
{
a[g]=a1[i]-48;
g++;
}
g=0;
for(int i=b1.length()-1;i>=0;i--)
{
b[g]=b1[i]-48;
g++;
}
g=0;
for(int i=0;i<n;i++)//加法主体
{
if(a[i]+b[i]+c[i]>=10)
{
c[i]=a[i]+b[i]+c[i]-10;
c[i+1]+=1;
}
else
{
c[i]=a[i]+b[i]+c[i];
}
}
if(a[n-1]+b[n-1]>=10)n++;
for(int i=max(a1.length(),b1.length())+4;i>=0;i--)
{
if(c[i]!=0)out=1;
if(out==1)end+=char(c[i]+48);
}
//cout<<end;
return end;
}
string cheng(string s1,string s2)
{
int k1=0,k2=0,a[2002],b[2002],c[2002],out=0;
string myout;
memset(a,0,sizeof(int)*2002);
memset(b,0,sizeof(int)*2002);
memset(c,0,sizeof(int)*2002);
for(int i=s1.size()-1;i>=0;i--) a[++k1]=s1[i]-'0';
for(int i=s2.size()-1;i>=0;i--) b[++k2]=s2[i]-'0';
for(int i=1;i<=k1;i++){
for(int j=1;j<=k2;j++) c[i+j-1]+=a[i]*b[j];
}
for(int i=1;i<=2002;i++) c[i+1]+=c[i]/10,c[i]%=10;
out=0;
for(int i=2001;i>=1;i--)
{
if(c[i]!=0)out=1;
if(out==1)myout+=char(c[i]+48);
}
return myout;
}
string chu(string a,string b)
{
int n,g=0,num=0;
n=b.length();
string x,s,c,s1,end="";//x存储每次要除法的数字 ,c为商
bool out=0;
//s,s1皆为临时变量
if(bijiao(a,b)==-1)return "0";
x=a.substr(0,b.length()-1);
for(int i=b.length()-1;i<a.length();i++)
{
s="";
s1="";
x+=a[i];
//cout<<x<<endl;
while(x.length()>0&&x[0]=='0')x=x.substr(1,x.length()-1);
//cout<<"正在计算"<<x<<endl;
//cout<<"x:"<<x<<" b:"<<b<<bijiao(x,b)<<endl;
if(bijiao(x,b)==-1)
{
c+='0';
g++;
continue;//是否比除数大
}
else//如果比除数大,开始除法
{
for(int g1=9;g1>=0;g1--)//从1开始尝试
{
s=int_to_string(g1);
//cout<<" i:"<<i<<" x:"<<x<<" g1:"<<g1<<" c:"<<c<<"乘法结果(g1*b):"<<cheng(s,b)<<" 被除数-乘法结果:"<<jian(x,cheng(s,b))<<"比较:"<<bijiao(jian(x,cheng(s,b)),b)<<endl;
if(bijiao(cheng(s,b),x)<=0)//翻译成人话if(x-(i*b)<b)意思为:被除数-尝试的数*除数<除数 因为必须保证除法除完
{
//下一步:没有除完的数字留给下一步做
//cout<<"i am doing";
x=jian(x,cheng(s,b));//要除的数-结果
c+=char(g1+48);//存入商
break;
}
}
}
}
out=0;
if(c[0]=='0')
{
while(c.length()>0&&c[0]=='0')c=c.substr(1,c.length()-1);
}
return c;//只返回商
}
string yushu(string a,string b,string c)//求余数,需要商,被除数,除数
{
return jian(b,cheng(a,c));
}
int main()
{
string a,b,c;
cin>>a>>b;
if(a=="0")
{
cout<<"0";
return 0;
}
c=chu(a,b);#include<bits/stdc++.h>
using namespace std;
int a[2002],b[2002],c[2002],n=0;
bool out=0;
void nixu(bool x,string z)
{
int g=0;
if(x==0)
{
for(int i=z.length()-1;i>=0;i--)
{
a[g]=z[i]-48;
g++;
}
}
else
{
for(int i=z.length()-1;i>=0;i--)
{
b[g]=z[i]-48;
g++;
}
}
}
string jia(string a1,string b1)
{
n=max(a1.length(),b1.length());
for(int i=0;i<=n+2;i++)
{
a[i]=0;
b[i]=0;
}
string end="";
nixu(0,a1);
nixu(1,b1);
int g=0;
for(int i=0;i<n;i++)
{
if(a[i]+b[i]+c[i]>=10)
{
c[i]=a[i]+b[i]+c[i]-10;
c[i+1]+=1;
}
else
{
c[i]=a[i]+b[i]+c[i];
}
}
if(a[n-1]+b[n-1]>=10)n++;
for(int i=n-1;i>=0;i--)
{
if(c[i]!=0)out=1;
if(out==1)end+=char(c[i]+48);
g++;
}
return end;
}
int main()
{
string a,b;
cin>>a>>b;
cout<<jia(a,b);
}
cout<<c<<endl<<yushu(c,a,b);
}
记得给好评!!!