发布时间:2022-08-19 12:47
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
高精度减法
输入格式
两行,表示两个非负整数a、b,且有a > b。
输出格式
一行,表示a与b的差
样例输入
1234567890987654321
9999
样例输出
1234567890987644322
注:题目来自蓝桥杯
题解:设置三个数组分别逆序存放a,b以及它们的差,模拟减法的方式从低位依次计算,最后从结构数组的第一个非零元依次输出即可。
代码:
#include
#include
using namespace std;
const int maxn = 1000;
int bj[maxn], j[maxn], s[maxn];//被减数、减数、结果数组
int main()
{
string bjs, js;
cin >> bjs >> js;
reverse(bjs.begin(), bjs.end());//模拟竖式减法,翻转后,从个位开始计算
reverse(js.begin(), js.end());
int l = bjs.length(), ll = js.length();
for(int i = 0; i < l; i++)
bj[i] = bjs[i] - '0';
for(int i = 0; i < ll; i++)
j[i] = js[i] - '0';
for(int i = 0; i < max(l, ll); i++)
{
if(bj[i] >= j[i])//该位上大于可直接相减
s[i] = bj[i] - j[i];
else//当不够减时,依次对高位判断借一得十
{
bj[i] += 10;
s[i] = bj[i] - j[i];
int k = i + 1;
for(int m = k; m < l; m++)
{
if(bj[m] > 0)
{
bj[m]--;
break;
}
else
bj[m] = 9;
}
}
}
int lens = maxn;
for(int i = maxn; i >= 0; i--)//对结果数组从后往前找到第一个非零元素位置
if(s[i]) break;
else
lens--;
for(int i = lens; i >= 0; i--)
cout << s[i];
cout << endl;
return 0;
}