#include <iostream>
#include<cstring>
using namespace std;
int main()
{
// flag用于最后判断是否添加符号
int i, j, flag = 0;
string a_s, b_s;
int a[10088] = { 0 }, b[10088] = { 0 }, c[10088] = { 0 };//数组初始化 //以防万一数组长度尽量大
cin >> a_s;
cin >> b_s;
int la = a_s.length(), lb =b_s.length(); //计算a_s b_s的长度
int l_max = max(la, lb);
//计算a_s b_s的最大长度,确定做减法时的循环次数
for (i = 0; i < la; i++)
{
a[la - i] = a_s[i] - '0'; //将字符转换成数字并倒置储存
//这里应该注意i是从0开始的 所以 la-i>=1!!!!
}
for (i = 0; i < lb; i++)
{
b[lb - i] = b_s[i] - '0';
}
if (la > lb || la == lb && a_s >= b_s) //判断a是否大于b
{
for (i = 1; i <=l_max; i++)
{ // i从1开始循环
if (a[i] < b[i])
{ //若a[i]<b[i]需要从下一位借位 及下一位自减处理;本位数字+10 再参与计算
a[i + 1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
}
else //当a<b时 a-b 为负数 所以要变为b-a
{
flag = 1;
for (i = 1; i <=l_max; i++) // i从1开始循环
{
if (b[i] < a[i])
{
b[i + 1]--;
b[i] += 10;
}
c[i] = b[i] - a[i];
}
}
if (flag)
{
cout << "-"; //若flag为真 输出负号
}
while (c[l_max] == 0 && l_max > 1)
{
l_max--; //因为C数组是导致储存的 所以假设01100会被储存为 00110
// 所以要去除多余的零变为 0011
//但是要注意0-0 这种情况 即 保留最后一个零 所以l_max>1 最后一位不参与循环
}
for (i = l_max; i >0; i--)
{
cout << c[i]; //倒置输出
}
return 0;
}
C++ 高精度自减
最新推荐文章于 2023-07-17 04:00:00 发布