高精度加法就是一位一位的运算,很简单的道理,但是自己用数组模拟出来的代码非常繁杂,就直接用他的高精度加法模板了,根据这个模板可以写出减法和乘法,只需要改动子程序部分就可以了。减法多一项比较环节,将所有减法全部转换为较大数减去较小数,更方便计算。乘法部分主要的因素在于位与位相乘后所处的权值位置,由第i位乘上第j位得到的数应该在第i+j位上,也就是C【i+j】+=A【i】*B【j】;
高精度加法:
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
void add(int A[],int B[],int C[])
{
for(int i=0;i<=lc-1;i++)
{
C[i]+=A[i]+B[i];
C[i+1]+=C[i]/10;
C[i]%=10;
}
if(C[lc])lc++;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string a,b;
cin>>a>>b;
cout<<"Case "<<i<<":"<<endl;
cout<<a<<" + "<<b<<" = ";
int A[N],B[N],C[N];
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
la=a.size(),lb=b.size();lc=max(la,lb);
for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
add(A,B,C);
for(int j=lc-1;j>=0;j--)
{
cout<<C[j];
}
cout<<endl;
if(i!=n)cout<<endl;
}
}
高精度减法:
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
void Minus(int A[],int B[],int C[])
{
for(int i=0;i<=lc-1;i++)
{
C[i]=C[i]+A[i]-B[i];
if(C[i]<0)
{
C[i]+=10;
C[i+1]--;
}
C[i+1]+=C[i]/10;
C[i]%=10;
}
while(lc-1>0&&!C[lc-1])lc--;
}
int cmp(int A[],int B[])
{
if(la!=lb)return la>lb;
for(int i=la-1;i>=0;i--)
{
if(A[i]!=B[i])return A[i]>B[i];
}
return 1;
}
int main()
{
int n;
cin>>n;
while(n--)
{
string a,b;
cin>>a>>b;
int A[N],B[N],C[N];
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
la=a.size(),lb=b.size();
for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
if(!cmp(A,B))
{
swap(A,B);
cout<<"-";
}
lc=max(la,lb);
Minus(A,B,C);
for(int j=lc-1;j>=0;j--)cout<<C[j];
cout<<endl;
}
}
高精度乘法:
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
void Times(int A[],int B[],int C[])
{
for(int i=0;i<=la-1;i++)
{
for(int j=0;j<lb;j++)
{
lc=max(lc,i+j);
C[i+j]=C[i+j]+A[i]*B[j];
C[i+j+1]+=C[i+j]/10;
C[i+j]%=10;
}
}
while(C[lc])lc++;
while(lc-1>0&&!C[lc-1])lc--;
}
int main()
{
int n;
string a,b;
cin>>a>>b;
int A[N],B[N],C[N];
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
la=a.size(),lb=b.size();
for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
lc=max(la,lb);
Times(A,B,C);
for(int j=lc-1;j>=0;j--)cout<<C[j];
cout<<endl;
}
高精度除法有两种情况,一种是高精度除以低精度,一种是高精度除以高精度,而高精度除以高精度的方法也同样可以解决高精度除以低精度,所以就直接用高精度除以高精度的方法去完成就行了,复杂度等同于高精度除以低精度,为O(n)。
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
int cmp(int A[],int B[])
{
if(A[lb]>0)return 1;
for(int i=lb-1;i>=0;i--)
{
if(A[i]!=B[i])return A[i]>B[i];
}
return 1;
}
void div(int A[],int B[],int C[])
{
for(int i=la-lb;i>=0;i--)
{
while(cmp(A+i,B))
{
for(int j=0;j<=lb-1;j++)
{
if(A[i+j]<B[j])
{
A[i+j+1]--;
A[i+j]+=10;
}
A[i+j]-=B[j];
}
C[i]++;
}
}
while(lc-1>0&&!C[lc-1])lc--;
}
int cmp1(int A[],int B[])
{
if(la!=lb)return la>lb;
for(int i=la;i>=0;i--)
{
if(A[i]!=B[i])return A[i]>B[i];
}
return 1;
}
int main()
{
int n;
string a,b;
cin>>a>>b;
int A[N],B[N],C[N];
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
la=a.size(),lb=b.size();
for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
lc=la;
if(!cmp1(A,B))
{
cout<<0<<endl;
for(int i=la-1;i>=0;i--)cout<<A[i];
cout<<endl;
return 0;
}
div(A,B,C);
for(int j=lc-1;j>=0;j--)cout<<C[j];
cout<<endl;
while(la-1>0&&!A[la-1])la--;
for(int j=la-1;j>=0;j--)cout<<A[j];
cout<<endl;
}