C++中数据存储的范围是有限的,最长的longlong型最大只能存储2^63-1。如果要是需要存储更大的数就只能使用数组了。这样存储的数的运算需要另外编写程序。
这里介绍高精度减法
这种减法的运算类似于小学学习的竖式,从个位开始,逐位相加,如果不够则需借1。
首先我们需要先读入数据,这里使用一个字符串读入。
减法,存在被减数小于减数的情况,a-b=-(a-b),对于这种情况我们只要将被减数和减数交换,输出时加一个负号即可。那我们怎么判断它们的大小呢。以字符串的形式存储,无法直接比较,为了方便使用string存储字符串。先是比较它们的长度,如果不等,结果显然;如果相等,string类可以直接字符串比较,比较的是字典序,注意只有相等才可以这么比较(“1234”<“2”)。如果被减数小于减数,将二者交换,可以直接使用swap(s1,s2)。注意如果比较长度时,将其存储了,此时别忘了交换。
由于读入时首位是最大位,而运算时需要从个位开始,再将字符串反序的存储到一个整形数组之中,字符串的存储采用的是ASCII码,转换时,需要减去’0’。
接着就逐位相减即可,定义一个辅助变量,记录借位。注意,如果借位已经减掉了,记得置零。
最后就是输出,比如100001-100000,直接输出就是000001,需要去除前导零。另外如果是1-1,结果为一个零,不能去除
点击查看 高精度数的四则运算
代码
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=1e5;
string s1,s2;
int a[N],b[N],ans[N];
int main()
{
cin>>s1>>s2;
int sign=0; //符号
int len1=s1.length();
int len2=s2.length();
if(len1<len2||(len1==len2&&s1<s2)) //判断大小
{
sign=1; //结果为负
swap(s1,s2); //值交换
swap(len1,len2); //长度交换
}
for(int i=1;i<=len1;i++)
a[i]=s1[len1-i]-'0'; //反序存储
for(int i=1;i<=len2;i++)
b[i]=s2[len2-i]-'0';
int len=max(len1,len2); //答案长度最长为二者中最长的
int tmp=0; //借位
for(int i=1;i<=len;i++)
{
a[i]-=tmp; //减去上一次的借位
tmp=0; //借位用过了,置零
if(a[i]<b[i])
tmp=1; //此次借位,标记
ans[i]=a[i]+10*tmp-b[i];
}
int i;
for(i=len;i>1;i--) //除去前导0,但不能去除答案就为0的
if(ans[i]!=0)
break;
if(sign) //负号
cout<<"-";
for(;i;i--)
cout<<ans[i]; //反序输出
return 0;
}