HDOJ 1002 A + B Problem II

题目描述

我有一个非常简单的问题要问你。给定两个整数A和B,你要做的就是计算A + B的和。

input

输入的第一行包含整数T(1 <= T <= 20),表示测试用例的数量。 然后是T行,每行包含两个正整数,A和B.请注意,整数非常大,这意味着您不应该使用32位整数来处理它们。 您可以假设每个整数的长度不超过1000

output

对于每个测试用例,您应输出两行。 第一行是“Case#:”,#表示测试用例的编号。 第二行是方程“A + B = Sum”,Sum表示A + B的结果。注意方程中有一些空格。 在两个测试用例之间输出一个空行。

思路分析

这是一个大数问题,输入的值不能用常见的int long 等来表示,因此考虑字符数组存储然后逐位相加
重点在于:进位 本位数字为 (a+b+前一位进位)%10 进位为 (a+b+前一位进位)/10
最后要注意输出的格式,最后一个输出后不用换行

源代码

#include<iostream>
#include<cstring>
using namespace std;
char a[1010],b[1010],c[1010],d[1010];
int main()
{
    int n,len,count=0;
    cin>>n;
    while(n--){
        count+=1;
        cin>>a>>b;
        int len1 = strlen(a);
        int len2 = strlen(b);
        int t1=0;
        //将a串反转
        for(int i=len1-1;i>=0;i--){
            c[t1] = a[i];
            ++t1;
        }
        t1=0;
        //将b串反转
        for(int i=len2-1;i>=0;i--){
            d[t1] = b[i];
            ++t1;
        }
        //补位
        if(len1>len2){
            len = len1;
            for(int i=len2;i<len1;i++)
            {
                d[i] = '0';
            }
        }else{
            len = len2;
            for(int i=len1;i<len2;i++)
            {
                c[i] = '0';
            }
        }
        //逐个相加
        int a1,b1,t=0;
        for(int i=0;i<len;i++){
            a1 = c[i]-'0';
            b1 = d[i]-'0';
            d[i] = (a1+b1+t)%10+'0';//本位
            t = (a1+b1+t)/10;//进位
        }
	cout<<"Case "<<count<<":"<<endl;
        cout<<a<<" "<<"+ "<<b<<" = ";
        //输出 这里判断一下最高位是否需要进位,是则给最高位赋值进位,否不用管
        if(t!=0){
            d[len]=t+'0';
        }
	for(int i=len-1;i>=0;i--)
            cout<<d[i];
        if(n!=0)
            cout<<endl<<endl;
        else
            cout<<endl;
    }
}
原文地址:https://www.cnblogs.com/xp-thebest/p/14016457.html