大数加法

      因为计算机计算的数值位数有限,当要算两个几百位,几千位或者更大位数的加法时,直接输入不能再进行计算,所以要编写程序来模拟加法的运算过程,这样不管多少位的加法问题,都可以计算出来。

      基本思路,输入的时候两个数都是以字符串的形式输入的,测出每个字符串的长度(也就是该数的位数),因为字符串不能直接进行运算,所以测出长度之后将字符串形的数反向转化为整形数组的形式(例如输入两个数为100和10,转化为整形数组形式储存为001和01,让低位在前,是运算更方便),然后进行运算。

      要用到两个字符型数组来先保存输入的数,再定义3个整形数组,要将这三个数组中的元素开始的时候全部清零,其中两个来储存将字符型数转化过的整型数,再有一个就是来保存运算结果的数组。

      运算过程如下图:


程序(多组测试的):

#include<bits/stdc++.h>

using namespace std;

int main()

{

    inta1[1004],b1[1004],c[1004],t1,t2,t,i,k,n;

    char a2[1004],b2[1004];  这两个数组用来输入两个数;

    cin>>n;

    while(n--)                n组测试;

    {

     int j1=0,j2=0;     转化类型时候j1来当a1的下标,j2来当a2的下标;

     cin>>a2;

     cin>>b2;

     t1=strlen(a2);     测出两个字符串的长度;

     t2=strlen(b2);

    memset(c,0,sizeof(c));  将三个整型数组中的所有元素清零;

    memset(a1,0,sizeof(a1));

    memset(b1,0,sizeof(b1));

    for(i=t1-1;i>=0;i--)   将第一个字符串转化为整型数,保存在a1中;

       a1[j1++]=a2[i]-'0';

    for(i=t2-1;i>=0;i--)   将第二个字符串转化为整型数,保存在a2中;

       b1[j2++]=b2[i]-'0';

     t=max(t1,t2);

     for(i=0;i<t;i++)   将两个数组的数进行加法运算;

       c[i]=a1[i]+b1[i];

     for(i=0;i<t;i++)

     {

        if(c[i]>=10)       上面的运算数组中的数可能大于10

        {

           c[i+1]+=c[i]/10;   取整进位;

            c[i]=c[i]%10;      原位取余保存;

        }

     }

运算结果可能会比输入的数位数多一位,所以下面要判断结果是否多出了一位;

     if(c[t]==0)     判断下标为t的这一位就是看是否为多出一位,因为输入的数的最大长度为t。存储用到的最大下标为t-1;如果该位为0,则没有多出一位;

 {

       for(i=t-1;i>=0;i--)     从t-1输出就行;

         cout<<c[i];

     }

     else if(c[t]!=0)    如果该位不为0,则结果多了一位;

     {

        for(i=t;i>=0;i--)    从t输出。

           cout<<c[i];

     }

     cout<<endl;

    }

     return 0;

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值