超大数的加法

超大数的加法计算(我的第一篇博客)
Description
求a+b的值 Input 第一行一个整数T,表示接下来有T行
每行两个整数是a,b,(0<=a,b<=10^10000)
Output 输出值
Sample Input

 2 
 100 100
 10000000000 10000000000

Sample Output

  200 
  20000000000

/*
现在补一个C++版本的
*/

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char a[10005],b[10005],c[10005];
int len,def;
void inline addZero(int lena,int lenb,char *p)
{
    memset(c,'\0',sizeof(c));
    len = lena;
    def = lena - lenb;
    fill(c,c+def,'0');
    strcat(c,p);
    memset(p,'\0',sizeof(p));
    strcpy(p,c);
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(a,'\0',sizeof(a));
        memset(b,'\0',sizeof(b));
        cin>>a>>b;
        int lena = strlen(a);
        int lenb = strlen(b);
        if(lena!=lenb)
            lena > lenb?addZero(lena,lenb,b):addZero(lenb,lena,a);
        else
            len = lena;
        int k = 0,t = 0;
        memset(c,'\0',sizeof(c));
        for(int i = len-1; i>=0; i--)
        {
            int x = (a[i]-'0')+(b[i]-'0')+t;
            t = x / 10;
            c[k++] = x%10+'0';
        }
        if(t)
            c[k++] = t+'0';
        for(int i = k-1; i >= 0; i--)
            cout<<c[i];
        cout<<endl;
    }
    return 0;
}

/*
下面是入门的时候写的代码
*/

1
计算超大数跟我们手算一个道理

#include<stdio.h>
#include<string.h>
int max2(int m,int n)
{
    return m>n?m:n;
}//判断两个数更大的数函数,减少if的使用
int def(int s,int w)
{
    return s>w?s-w:w-s;
}//求差函数
int main()
{
    char a[10005]= {'0'},b[10005]= {'0'};
    int c[15000]= {0}; //必要的初始化操作
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int i=0,j=0,k,f,g;
        int x,y,l,p,q=0;
        scanf("%s %s",a,b);
        x=strlen(a),y=strlen(b);
        l=max2(x,y),f=def(x,y);
        if(x==y)//如果两个超大数位数相同
        {
            for(i=x-1; i>0; i--)
            {
                p=(a[i]-'0')+(b[i]-'0')+q;
                c[j]=p%10;
                q=p/10;//进位
                j++;
            }  //上面按手算法算到倒数第二位
            // 再算最后一位,值直接存到下一个数组元素格
            c[j]=(a[0]-'0')+(b[0]-'0')+q;
            for(k=j; k>=0; k--)
            {
                printf("%d",c[k]);//逆序输出出得结果
            }
        }
        else//两个超大数位数不同
        {
            for(i=l-1; i>=f; i--)
            {
                x=x-1,y=y-1;
                p=(a[x]-'0')+(b[y]-'0')+q;
                c[j]=p%10;
                q=p/10;//进位
                j++;
            }//先计算到位数少的位置
            for(g=f-1; g>0; g--)
            {
                if(x>y)//看哪个数位数多
                {
                    p=(a[g]-'0')+q;
                    c[j]=p%10;
                    q=p/10;
                    j++;
                }
                else
                {
                    p=(b[g]-'0')+q;
                    c[j]=p%10;
                    q=p/10;
                    j++;
                }
            }//同理按手算法算到倒数第二位
            // 再算最后一位,值直接存到下一个数组元素格
            if(x>y) c[j]=(a[0]-'0')+q;
            else c[j]=(b[0]-'0')+q;
            for(k=j; k>=0; k--)
            {
                printf("%d",c[k]);
            }//逆序输出得结果
        }
        printf("\n");

    }
    return 0;
}

                `
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo Bliss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值