内容概述
c++已经提供了一些数学基础运算,但我们知道long long的范围只有[-2^63,2^63-1],有一定的局限性,如果要处理的数据有上千位、上万位怎么办呢?那就该使用高精度计算了。
整体思路
将需要运算的数以字符串的形式读入,按位存储到数组中,再模拟列竖式的方法进行计算,再输出。
代码实现
能力较弱请见谅 :)
加法
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
string A,B;
int a[MAXN],b[MAXN],res[MAXN];
int main()
{
cin>>A;
cin>>B;
for(int i=A.length()-1,j=1;i>=0;i--,j++)
a[j]=A[i]-'0';
for(int i=B.length()-1,j=1;i>=0;i--,j++)
b[j]=B[i]-'0'; //将读入的数字倒序存储
int len=max(A.length(),B.length()); //将结果长度暂时记为而最大数的位数
for(int i=1;i<=len;i++)
{
res[i]+=a[i]+b[i]; //按位相加
if(res[i]>=10)
{
res[i]%=10; //进位
res[i+1]+=1;
}
}
if(res[len+1]!=0)len++; //检测结果长度是否增加
for(int i=len;i>=1;i--)
cout<<res[i];
return 0;
}
减法
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
string A,B;
int a[MAXN],b[MAXN],res[MAXN];
int main()
{
cin>>A;
cin>>B;
char flag='p'; //符号默认为positive,最好使用bool型变量
int len=max(A.length(),B.length());
for(int i=A.length()-1,j=1;i>=0;i--,j++) //倒序存储
a[j]=A[i]-'0';
for(int i=B.length()-1,j=1;i>=0;i--,j++)
b[j]=B[i]-'0';
if(A.length()<B.length()) //默认A为更大数,若B>A则进行交换,符号变为negative
{
swap(a,b);
flag='n';
}
else if(A.length()==B.length())
{
for(int i=1;i<=len;i++)
{
if(a[i]<b[i])
{
swap(a,b);
flag='n';
break;
}
}
}
for(int i=1;i<=len;i++)
{
res[i]=a[i]-b[i]; //按位相减
if(res[i]<0)
{
a[i]+=10; //不够则向上一位“借1”
a[i+1]--;
res[i]=a[i]-b[i];
}
}
for(int i=len;i>1;i--) //计算结果长度,A、B相同时不要忘记输出0!(其实前面就可以特判的)
{
if(res[i]==0)
{
len--;
}
else
break;
}
if(flag=='n')cout<<'-';
for(int i=len;i>=1;i--)
{
cout<<res[i];
}
return 0;
}
乘法
可以先取出两数的符号,再进行运算,最后在结果里加上符号,如正数*负数为负数,懒得写了这里就不写了
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
string A,B;
int a[MAXN],b[MAXN],res[MAXN],la,lb,len; //和前面类似
int main()
{
cin>>A>>B;
la=A.length();lb=B.length();
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'; //依旧倒序存储
}
for(int i=1;i<=la;i++)
{
for(int j=1;j<=lb;j++)
{
res[i+j-1]+=a[i]*b[j]; //用A的每一位乘B的每一位
res[i+j]+=res[i+j-1]/10;
res[i+j-1]%=10; //进位
}
}
len=la+lb; //两数相乘,最大位数为两数位数的和
while(res[len]==0&&len>1) len--; //len 最小减到 1
for(int i=len;i>=1;i--)
cout<<res[i];
return 0;
}
除法(高精对低精)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
string sa;
long long a[MAXN],b,res[MAXN],la,len,x;
int main()
{
cin>>sa>>b;
la=sa.length();
for(int i=0;i<la;i++)
a[i+1]=sa[i]-'0'; //除法无需倒序存储
for(int i=1;i<=la;i++)
{
res[i]=(x*10+a[i])/b; //从最高位开始除
x=(x*10+a[i])%b; //x为上一步操作的余数
}
len=1;
while(res[len]==0&&len<la) len++;//计算结果长度
for(int i=len;i<=la;i++)
cout<<res[i];
return 0;
}