大整数加法

方法一:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi 3.1415
typedef long long ll;
using namespace std;

int main()
{
    char a[1000],a1[1000],b[1000],b1[1000],c[1000],c1[1000];
    while(~scanf("%s %s",a1,b1))
    {
        int len1=strlen(a1);
        int len2=strlen(b1);
        int k=0,q=0;
        for(int i=0; i<len1; i++)//先对读入的数据进行预处理,去掉前导0
        {
            if(a1[i]=='0'&&i==len1-1)
            {
                a[0]='0';
                a[1]=0;
            }
            else if(a1[i]!='0')
            {
                for(int j=len1-1; j>=i; j--)//倒序输入另一个数组,便于计算
                {
                    a[k++]=a1[j];
                }
                a[k]=0;
                break;
            }
        }
        for(int i=0; i<len2; i++)
        {
            if(b1[i]=='0'&&i==len2-1)
            {
                b[0]='0';
                b[1]=0;//记得每个字符数组要加上\0
            }
            else if(b1[i]!='0')
            {
                for(int j=len2-1; j>=i; j--)
                {
                    b[q++]=b1[j];
                }
                b[q]=0;
                break;
            }
        }
        len1=strlen(a);
        len2=strlen(b);//将字符更长的放在上面
        if(len1<len2)
        {
            swap(a,b);
            swap(len1,len2);
        }
        for(int i=0; i<900; i++)//初始化c数组,c是存储计算结果
        {
            c[i]='0';
        }
        c[900]=0;
        for(int i=0; i<len2; i++)//模拟竖式计算
        {
            if(c[i]-'0'+a[i]+b[i]-'0'-'0'<=9)
            {
                c[i]+=a[i]+b[i]-'0'-'0';
            }
            else if(c[i]-'0'+a[i]+b[i]-'0'-'0'>=10)
            {
                c[i]+=a[i]+b[i]-'0'-'0'-10;
                c[i+1]++;
            }
        }
        for(int i=len2; i<len1; i++)
        {
            if(c[i]+a[i]-'0'-'0'>=10)
            {
                c[i]='0';
                c[i+1]++;
            }
            else
            {
                c[i]+=a[i]-'0';
            }
        }
        if(c[len1]=='0')//处理末尾0
        {
            c[len1]=0;
        }
        else c[len1+1]=0;
        int len=strlen(c);
        k=0;
        for(int i=len-1; i>=0; i--)//将计算结果转正
        {
            c1[k++]=c[i];
        }
        c1[k]=0;
        printf("%s\n",c1);
    }
    return 0;
}

方法二

#include<bits/stdc++.h>
using namespace std;
int x[250],y[250];
int main()
{
    string a,b;
    int la,lb,l;
    getline(cin,a);
    getline(cin,b);//读入;
    la=a.size();
    lb=b.size();
    l=max(la,lb);//l是两数和的最大位数;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());//倒序存储,有助于对其个位 ;
    for(int i=0; i<la; i++)
    {
        x[i]=a[i]-'0';
    }
    for(int i=0; i<lb; i++)
    {
        y[i]=b[i]-'0';
    }//数字存储;
    for(int i=0; i<l; i++)
    {
        x[i]+=y[i];//对位相加;
        if(x[i]>=10)
        {
            x[i+1]++;
            x[i]-=10;
        }//处理进位,只需考虑和大于等于十的情况;
    }
    while(x[l]==0&&l>=1) //和有可能为0,也要输出;
        l--;//处理和的首位为0的情况:两个加数开头可以有0;
    for(int i=l; i>=0; i--)
    {
        cout<<x[i];
    }//逆序输出;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值