1.高精度加法
A+B问题
思路:
1.字符串输入
2.反向装入整型数组中
3.每位相加(注意进位)
4.反向输出
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string A;
string B;
int C[1000001],a[1000001],b[1000001];
int main(){
cin>>A>>B;
int la=A.length();
int lb=B.length();
for(int i=0;i<la;i++){//将字符转为整数反转存到整型数组a[]中
a[la-i]=A[i]-'0';
}
for(int i=0;i<lb;i++){//将字符转为整数反转存到整型数组b[]中
b[lb-i]=B[i]-'0';
}
int lc=max(la,lb);//以比较长的数为界,短的数用0补齐(实际上定义全局变量数组是就有这个效果了)
int k=0;
/*下面这段另一种写法
for(int i=1;i<=lc;i++){
c[i]+=a[i]+b[i];
c[i+1]=(a[i]+b[i])/10;
c[i]%10;
}
if(c[lc+1]>0){//进位
len_max++;
}*/
for(int i=1;i<=lc;i++){
C[i]=(a[i]+b[i]+k)%10;//进位
k=(a[i]+b[i]+k)/10;
}
if(k){//进位
cout<<1;
}
for(int i=lc;i>=1;i--){//反向输出
cout<<C[i];
}
return 0;
}
2.高精度减法
A-B问题
思路:
1.字符串输入
2.判断两数大小,保证大数在前,是负数首先输出符号
3.反向装入整型数组中
4.每位相减(注意借位)
5.去除前导零(最少留一个0)
6.反向输出
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string A;
string B;
int c[1000001],a[1000001],b[1000001];
int main(){
cin>>A>>B;
int la=A.length();
int lb=B.length();
if(la<lb||la==lb&&A<B){//当A<B时候要交换两个数,首先比较长度,长度相等比较字典序
swap(A,B);
swap(la,lb);
cout<<'-';//小于就输出符号
}
for(int i=0;i<la;i++){
a[la-i]=A[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=B[i]-'0';
}
int lc=la;
for(int i=1;i<=lc;i++){
if(a[i]<b[i]){//借位
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
}
while(c[lc]==0&&lc>1)lc--;//消除前导零,注意当A==B时要留一个
for(int i=lc;i>=1;i--){
cout<<c[i];
}
return 0;
}
3.高精度乘法
A*B问题
思路:
1.字符串输入
2.反向装入整型数组中
3.交叉相乘(双重循环)
5.去除前导零(最少留一个0)
4.反向输出
#include<iostream>
#include<string>
using namespace std;
string x,y;
int a[100005],b[100005],c[100005];
int main(){
cin>>x>>y;
int la=x.length();
int lb=y.length();
for(int i=0;i<la;i++){
a[la-i]=x[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=y[i]-'0';
}
for(int i=1;i<=la;i++){
for(int j=1;j<=lb;j++){
c[i+j-1]+=a[i]*b[j];//交叉想乘
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
int lc=la+lb;
while(c[lc]==0&&lc>1)lc--;//去前导零
for(int i=lc;i>=1;i--){
cout<<c[i];
}
return 0;
}