1. 程式人生 > 實用技巧 >HDOJ 1002 A + B Problem II

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;
    }
}