高精度顾名思义计算难以用常用数据类型计算的情况,主要思想即用数组模拟非常长的整数实现运算。高精度加减法实际上就是对竖式加减法的过程模拟,是一类模拟题,没有什么思维难度而且方法就在自己手上 (不会的找小学老师)。1
不考虑负数的情况
先上代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[2000],b[2000],c[2000];
int main()
{
char A[2000],B[2000];
cin>>A>>B;
for(int i=1;i<=strlen(A);i++)//存数字
a[strlen(A)-i]=A[i-1]-'0';
for(int i=1;i<=strlen(B);i++)
b[strlen(B)-i]=B[i-1]-'0';
int len=max(strlen(A),strlen(B));
for(int i=0;i<len;i++)
{//实现进位
c[i]+=a[i]+b[i];
c[i+1]+=(c[i]/10);
c[i]%=10;
}
if(c[len]!=0) len++;//判断最高位是否进位了
for(int i=len-1;i>=0;i--)
cout<<c[i];//倒序输出
cout<<endl;
}
代码理解没什么难度,关键是几个注意点和易掉的地方,比如最高位的判断等。
考虑负数的情况(n1-n2)
同样先上代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[100000001],b[10000001],c[10000001],lena,lenb,lenc,i;
char n[100001],n1[100001],n2[100001];
int main()
{
scanf("%s",n1);
scanf("%s",n2);
if(strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0))//n1-n2<0的情况
{
strcpy(n,n1);
strcpy(n1,n2);
strcpy(n2,n);//变成n2-n1取负
cout<<"-";
}
lena=strlen(n1);lenb=strlen(n2);
for(i=0;i<=lena-1;i++)a[lena-i]=int(n1[i]-'0');
for(i=0;i<=lenb-1;i++)b[lenb-i]=int(n2[i]-'0');
i=1;
while(i<=lena||i<=lenb)
{
if(a[i]<b[i])
{//关键处,模拟竖式减法
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
i++;
}
lenc=i;
while((c[lenc]==0)&&(lenc>1))lenc--;//最高位0判断
for(i=lenc;i>=1;i--)cout<<c[i];//倒序输出
cout<<endl;
return 0;
}
该方法的搬运出处,代码审过了简洁明了,自己一开始还想着套用加法的方法,发现还是有点区别,第一个‘-’就让我弄了半天,其实仔细想想也就是小学学的竖式减法,而且运算法则也不太一样,完全套用不合适哦。
(好喜欢这位老哥的代码风格,果然搬运就是好)
总之
这年头,谁敢说自己会加减乘除
必须从低位到高位处理进位或借位,否则可能发生顺序上的错误。 ↩︎