杭电1002 A + B Problem II(字符串+详细解答!!!)

版权声明:ACM代码随意转载。算法描述需备注来源。谢谢合作。 https://blog.csdn.net/Sensente/article/details/90118169

杭电1002 http://acm.hdu.edu.cn/showproblem.php?pid=1002

题目大意:大数相加。

思路 :用字符串模拟,每次从后往前同位相加,结果大于等于10 前位进一。

考虑三种情况:

一、
a串长度大于b串。
二、
b串长度大于a串。
三、
a、b串长度相等。

对于第一、二种情况。
我们需要将两串字符串进行对齐处理。即用长度较短的字符串去对齐长度较长的。然后将短串前位全部置0对齐。然后直接进行加减即可。

对于第三种情况。
需要将a、b串同时后移一位以防相加会产生进位。

对于第三种情况的输出,需要特判前置是否为0,若是则从后一位开始输出。

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <cmath>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
int n;
char a[1005];
char b[1005];
int c[1005];
char ax[1005];
char bx[1005];
bool f; //f作为进位判断
int k;
int main() {
    while(cin >> n) {
        for(k = 1;k <= n ;k++) {
        //初始化
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(ax,0,sizeof(ax));
        memset(bx,0,sizeof(bx));
        f = 0;
        cin >> a;
        cin >> b;
        int lena = strlen(a);
        int lenb = strlen(b);
        //第一种情况
        if(lena > lenb) {
                for(int i = lena - 1,j = lenb - 1;i >= 0,j >= 0;i--,j--) {
                    bx[i] = b[j];
                }
                for(int i = 0;i < lena - lenb;i++) {
                    bx[i] = '0';
                }
                for(int i = lena - 1; i >= 0; i--) {
                    if (!f)
                    c[i] = (a[i] - '0') + (bx[i] - '0');
                    if (f) {
                        c[i] = (a[i] - '0') + (bx[i] - '0') + 1;
                        f = 0;
                    }
                    if(c[i]>=10) {
                        c[i] -= 10;
                        f = 1;
                    }
                }
                //cout<<b<<endl<<bx<<endl;
                cout<<"Case "<<k<<":"<<endl;
                cout<< a << " + " << b <<" "<<"=" << " ";
                for(int i = 0;i<lena;i++) {
                    cout<<c[i];
                }cout<<endl;if(k!=n) cout<<endl;
            }
            //第二种情况
            else if(lena < lenb) {
                for(int i = lenb - 1,j = lena - 1;i >= 0,j >= 0;i--,j--) {
                    ax[i] = a[j];
                }
                for(int i = 0;i < lenb - lena;i++) {
                    ax[i] = '0';
                }
                for(int i = lenb - 1; i >= 0; i--) {
                    if (!f)
                    c[i] = (ax[i] - '0') + (b[i] - '0');
                    if (f) {
                        c[i] = (ax[i] - '0') + (b[i] - '0') + 1;
                        f = 0;
                    }
                    if(c[i]>=10) {
                        c[i] -= 10;
                        f = 1;
                    }
                }
                cout<<"Case "<<k<<":"<<endl;
                cout<< a << " + " << b <<" "<<"=" << " ";
                for(int i = 0;i<lenb;i++) {
                    cout<<c[i];
                }cout<<endl;if(k!=n) cout<<endl;
            }
            //第三种情况
            else if(lena == lenb) {
                for(int i = lena;i > 0 ;i--) {
                    ax[i] = a[i - 1];
                    bx[i] = b[i - 1];
                }
                ax[0] = '0';
                bx[0] = '0';
                //cout<<a<<endl<<b;
                for(int i = lena; i >=0 ;i--) {
                    if (!f)
                    c[i] = (ax[i] - '0') + (bx[i] - '0');
                    if (f) {
                        c[i] = (ax[i] - '0') + (bx[i] - '0') + 1;
                        f = 0;
                    }
                    if(c[i]>=10) {
                        c[i] -= 10;
                        f = 1;
                    }
                }
                cout<<"Case "<<k<<":"<<endl;
                cout<< a << " + " << b <<" "<<"=" << " ";
                if(c[0] != 0) {
                    for(int i = 0; i <=lena; i++ ) {
                        cout<<c[i];
                    }cout<<endl;
                    if(k!=n) cout<<endl;
                }
                else if (c[0] == 0) {
                    for(int i = 1; i <= lena; i++) {
                        cout<<c[i];
                    }cout<<endl;
                    if(k!=n) cout<<endl;
                }
            }
        }
    }
    return 0;
}

本题输出注意 :

在最后一个Case输出时,只保留一个换行符。(PE原因)

猜你喜欢

转载自blog.csdn.net/Sensente/article/details/90118169