高精度加法

#include<iostream>
#include<vector>

using namespace std;

int main()
{
string a1,b1;
cin>>a1>>b1;//字符串形式输入两个加数
int lena=a1.length(),lenb=b1.length(),len=0,x=0;//x用于存放进位的数
vector<int> res;
int* a=new int[lena];
int* b=new int[lenb];
for(int i=0;i<lena;i++)
a[i]=a1[lena-1-i]-'0';//将两个数逆序存放进数组,即个位在前
for(int i=0;i<lenb;i++)
b[i]=b1[lenb-1-i]-'0';
while(len<lena||len<lenb)
{
res.push_back(a[len]+b[len]+x);//加x即加上之前的进位
x=res[len]/10;//除以x算出还需要向后进多少
res[len]%=10;//进位后的数
len++;
}
res.push_back(x);//最后一个进位直接变成最高位
if(x==0)
res.pop_back();//若进位为0则再退回去
for(int i=res.size()-1;i>=0;i--)
cout<<res[i];
return 0;
}

1

高精度减法

#include<iostream>
#include<vector>
#include<cstring>

using namespace std;

int main()
{
string a1,b1;
cout<<"输入被减数:";
cin>>a1;
cout<<"输入减数:";
cin>>b1; //字符串形式输入两个数
int lena,lenb,len=0,n=max(a1.length(),b1.length());
vector<int> res;
int* a=new int[n];
int* b=new int[n];
memset(a,0,4*n);
memset(b,0,4*n);
if(a1.length()<b1.length()||(a1.length()==b1.length()&&a1.compare(b1)<0))
{
swap(a1,b1);
cout<<"-";
}
lena=a1.length();
lenb=b1.length();
for(int i=0;i<lena;i++)
a[i]=a1[lena-1-i]-'0';//被减数放入a数组并且个位在前
for(int i=0;i<lenb;i++)
b[i]=b1[lenb-1-i]-'0';//减数放入b数组并且个位在前
while(len<lena||len<lenb)
{
if(a[len]<b[len])//如果不够减就借位
{
a[len+1]--;
a[len]+=10;
}
res.push_back(a[len]-b[len]);
len++;
}
while(res[res.size()-1]==0&&res.size()>1)//最高位的0不能输出,并且高位可能有多个0
res.pop_back();
for(int i=res.size()-1;i>=0;i--)
cout<<res[i];
return 0;
}

2

高精度乘法

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
string a1,b1;
cin>>a1>>b1;
int lena=a1.length(),lenb=b1.length(),len;
int a[1000],b[1000],res[2000],x;//x为进位
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(res,0,sizeof(res));
for(int i=0;i<lena;i++)
a[i]=a1[lena-1-i]-'0';
for(int i=0;i<lenb;i++)
b[i]=b1[lenb-1-i]-'0';
for(int i=0;i<lena;i++)
{
x=0;
for(int j=0;j<lenb;j++)
{
res[i+j]=a[i]*b[j]+x+res[i+j];//当前乘积+上次乘积进位+原数
x=res[i+j]/10;
res[i+j]%=10;
}
res[i+lenb]=x;//进位
}
len=lena+lenb;
while(res[len]==0&&len>1)//删除前导0
len--;
for(int i=len;i>=0;i--)
cout<<res[i];
return 0;
}

3

高精度除法

高精除以低精

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
int a[10000],res[10000],b,lena,x=0,len=0;//x保存余数
string a1;
memset(a,0,sizeof(a));
memset(res,0,sizeof(res));
cin>>a1>>b;
lena=a1.length();
for(int i=0;i<lena;i++)
a[i]=a1[i]-'0';
for(int i=0;i<lena;i++)
{
res[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
while(res[len]==0&&len<lena-1)
len++;
for(int i=len;i<lena;i++)
cout<<res[i];
return 0;
}

4

高精除以高精

#include<iostream>
#include<cstring>

using namespace std;

void init(int a[])
{
string s;
cin>>s;
a[0]=s.length();//用a[0]保存数组的长度
for(int i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0';
}

void print(int a[])
{
if(a[0]==0)
{
cout<<0;
return;
}
for(int i=a[0];i>0;i--)
cout<<a[i];
cout<<endl;
}

int compare(int a[],int b[])
//比较a和b的大小关系,若a>b则为1,若a<b则为-1,若a=b则为0
{
if(a[0]>b[0])
return 1;
if(a[0]<b[0])
return -1;
for(int i=a[0];i>0;i--)
{
if(a[i]>b[i])
return 1;
if(a[i]<b[i])
return -1;
}
return 0;
}

void jian(int a[],int b[])//计算a=a-b
{
int flag=compare(a,b);
if(flag==0)
{
a[0]=0;
return;
}
if(flag==1)
{
for(int i=1;i<=a[0];i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0)//修正a的位数,去除前导0
a[0]--;
}
}

void numcpy(int p[],int q[],int det)//复制p数组到q数组从det开始的地方
{
q[0]=p[0]+det-1;//修改长度
for(int i=1;i<=p[0];i++)
q[det+i-1]=p[i];
}

void chugao(int a[],int b[],int res[])
{
int tmp[10001];
res[0]=a[0]-b[0]+1;//a除以b的商的位数
for(int i=res[0];i>0;i--)
{
memset(tmp,0,sizeof(tmp));//数组清零
numcpy(b,tmp,i);//本质上是在b数组前面添加i-1个0(因为tmp数组一定全是0),使得b数组和a数组对齐
while(compare(a,tmp)>=0)
{
res[i]++;
jian(a,tmp);
}
}
while(res[0]>0&&res[res[0]]==0)
res[0]--;
}

int main()
{
int a[10001],b[10001],res[10001];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(res,0,sizeof(res));
init(a);
init(b);
chugao(a,b,res);
print(res);//输出商
print(a);//输出余数
return 0;
}

5