大数加法A+B

题号:1002

题意:
我有一个非常简单的问题要告诉你。给定两个整数 A 和 B,您的工作是计算 A + B 的总和。‎
Input:
输入的第一行包含一个整数 T(1<=T<=20),这意味着测试用例的数量。然后T线跟随,每行由两个正整数A和B组成。 请注意,整数非常大,这意味着你不应该使用32位整数来处理它们。您可以假定每个整数的长度不会超过 1000。
Output:
对于每个测试用例,应输出两行。第一行是"case #:",# 表示测试用例的数量。第二行是一个方程"A + B = sum",sum表示 A + B 的结果。在两个测试用例之间输出一个空白行。‎
Sample Input:
2
1 2
112233445566778899 998877665544332211
Sample Output:
Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

题意分析:因为每个整数的位数不超过1000位,则无法用int,long int 等(都会超过其表示的最大范围),最后联想到用字符串表示,并按位相加计算出其和。

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
const int mx=1005;
int sum[mx];
char s1[mx],s2[mx];
using namespace std;
int main()
{
    int t,flag=0;
    cin>>t;
    while(t--)
    {
        flag++;
        memset(sum,0,sizeof(sum)); ///初始化
        scanf("%s %s",s1,s2);
        int n=strlen(s1); ///计算字符串长度
        int m=strlen(s2); ///计算字符串长度
        int i=0;
        for(;;i++)
        {
            if(i==n||i==m) ///其中有一个长度计算完,结束循环
                break;
            sum[i]=sum[i]+(s1[n-i-1]-'0')+(s2[m-i-1]-'0');   ///将其中s1,s2转化位数字并相加
            if(sum[i]>9)
            {
                sum[i+1]+=1;     ///大于10进位
                sum[i]=sum[i]%10;
            }
        }
        if(n>=m)      ///如果s1的长度大于或等于s2
       {
            for(;i<n;i++)
            {
                sum[i]=sum[i]+s1[n-i-1]-'0';
            if(sum[i]>9)
            {
                sum[i+1]+=1;
                sum[i]=sum[i]%10;
            }
            }
        }
        else      ///如果s2的长度大于s1
        {
            for(;i<m;i++)
            {
                sum[i]=sum[i]+s2[m-i-1]-'0';
            if(sum[i]>9)
            {
                sum[i+1]+=1;
                sum[i]=sum[i]%10;
            }
            }
        }
        printf("Case %d:\n",flag);
        printf("%s + %s = ",s1,s2);
        if(sum[i]>0)      ///最后一位有进位就输出
            cout<<sum[i];
        for(int j=i-1;j>=0;j--)   //因为数字是按个位开始相加,最后输出时则需倒着输出
            cout<<sum[j];
            cout<<endl;
            if(t>=1)     ///格式输出,最后一组不会多隔一个空行
            cout<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值