C++ 高精度自减


#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值