题目
掌握了高精度加法运算后,爱学习的大头并没有停下探索的步伐,他正研
究着让他的计算器也能做大整数的减法运算
输入格式:共2行,第1行是被减数a,第2行是减数b。每个大整数不超过
200位,不会有多余的前导零。
输出格式:一行,即所求的差。没有多余的前导零
输入样例:9999999999
9999999999999999999988
输出样例:-9999999999989999999989
1.代码如下
代码如下(示例):
#include <iostream>
#include <string>
using namespace std;
int main()
{
string A,B;//两个减数
cin>>A>>B;
int lenA = A.length();//获取长度
int lenB = B.length();
//判断结果正负号 默认是正数
int sign = 0;
if(lenA<lenB)
{
//a的长度比b小 肯定是负数
sign = -1;
}
else if(lenA == lenB)
{
//a和b比较大小 a>b 1 a==b 0 a<b -1
sign = A.compare(B);
}
if(sign<0)
{
swap(A,B);//交换 别忘了最后的负号
}
lenA = A.length();//获取长度
lenB = B.length();
int a[100] = {0}, b[100] = {0};
//字符串逐个获取存在数组中
for(int i=0; i<lenA; i++)
{
a[lenA-i-1] = A[i]-'0';
}
for(int i=0; i<lenB; i++)
{
b[lenB-i-1] = B[i]-'0';
}
int sub[100] = {0};//存差值的
int lenS = 0;// sub数组的下标
while(lenS<lenA || lenS < lenB)
{
//小于其中任何一个减数 那么一直进行
if(a[lenS]<b[lenS])
{
//当前位置不够减 需要进位借1当10
a[lenS]+=10;
a[lenS+1]-=1;
}
sub[lenS] = a[lenS]-b[lenS];
lenS++;
}
if(sign<0)
{
cout<<"-";
}
while(sub[lenS]==0 && lenS>0)
{
lenS--;//去除多余的前导0
}
//倒序输出
for(int i = lenS; i>=0; i--)
{
cout<<sub[i];
}
return 0;
}
总结
int 类型粗略估计是2开头的10位数,long long 类型是9开头的19位数,只能使用字符串或者字符数组的方式进行存储,对应位置上的值需要做减法,减法比加法多了一步判断正负号;