大整数(高精度)加减法

大整数加减法

第一次写,涉及大整数加减运算
先来看看加法,主要思想是逐位相加,进位加1

#include <iostream>
#include <cstring>
using namespace std;
void  add(int a[], int b[],string str1, string str2)
{
   int i, j=0;
   for (i = str1.length() - 1;i >= 0;i--)
       a[j++] = str1[i] - '0';
   j = 0;
   for (i = str2.length() - 1;i >= 0;i--)
       b[j++] = str2[i] - '0';
   for (i = 0;i < 200;i++) //假设正整数最长为200位,根据实际需要调整
   {
       a[i] += b[i];          
       if (a[i] >= 10)      //如果大于等于10则有进位
       {
           a[i] -= 10;      //本位减10
           ++a[i + 1];      //下一位加1
       }
   }
}
void  print(int* a)     //输出控制,多余的0不要输出
{
   int flag = 0;
   for (int i = 200;i >= 0;i--)
   {
       if (flag == 1)
           cout << a[i];
       else if (a[i] != 0)
       {
           cout << a[i];
           flag = 1;
       }
   }
   if (flag == 0)     
       cout << '0';
}
int main()
{
   string str1, str2;
   int a[300] = { 0 }, b[300] = {0};
   //memset(a,0,sizeof(a));      //如此赋0也可以
   //memset(b,0,sizeof(b));
   cin >> str1 >> str2;
   add(a,b,str1,str2);
   print(a);
   return 0;
}

再来看看减法,默认第一个数大于第二个数。
主要思想是逐位相减,不够减借一。

#include <iostream>
#include <cstring>
using namespace std;
void  sub(int a[], int b[], string str1, string str2)
{
    int i, j = 0;
    for (i = str1.length() - 1;i >= 0;i--)
        a[j++] = str1[i] - '0';
    j = 0;
    for (i = str2.length() - 1;i >= 0;i--)
        b[j++] = str2[i] - '0';
    for (i = 0;i < 200;i++) //假设正整数最长为200位,根据实际需要调整
    {
        a[i] -= b[i];
        if (a[i] < 0)       //如果小于0则有借位
        {
            a[i] += 10;     //本位借10
            --a[i + 1];     //下一位减1
        }
    }
}
void  print(int* a)     //输出控制,多余的0不要输出
{
    int flag = 0;
    for (int i = 200;i >= 0;i--)
    {
        if (flag == 1)
            cout << a[i];
        else if (a[i] != 0)
        {
            cout << a[i];
            flag = 1;
        }
    }
    if (flag == 0)
        cout << '0';
}
int main()
{
    string str1, str2;
    int a[300] = { 0 }, b[300] = { 0 };
    cin >> str1 >> str2;
    sub(a, b, str1, str2);
    print(a);
    return 0;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值