大数加法~HDU 1002 A + B Problem II

题目链接:

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

题意:

数学题,A+B;

思路,这个数非常大,普通加法一定会超时,所以用大数加法。大数加法的基本思路是模拟我们做加法的时候的进位思想,从最低位开始模拟,

在我的代码里

v -- 进位, tmp -- 当前位2个数的和,k -- 答案数组的下标。

其中, tmp/10 可以得到要进的位数, 同理,tmp%10可以得到个位,就是答案数组对应的位

下面是AC代码:

#include <iostream>
#include <cstdio>
#include <string.h>

using namespace std;
const int MX = 1000+10;
char a[MX], b[MX];
int c[MX];

int main()
{
    int cas = 0;
    int T;
    scanf("%d", &T);
    while(T--)
    {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        memset(c, 0, sizeof(c));
        scanf("%s %s", &a, &b);
        int lena = strlen(a);
        int lenb = strlen(b);
        int tmp;
        int v = 0, k = 0;
        for(int i = lena-1, j = lenb-1;; --i, --j)
        {
            if(i < 0 && j < 0) break;
            if(i < 0) tmp = b[j]-'0'+v;
            else if(j < 0) tmp = a[i]-'0'+v;
            else tmp =(a[i]-'0')+(b[j]-'0')+v;
            c[k] = tmp % 10; //取个位
            v = tmp/10; //取要进的位
            if(((i == 0)&&(j <= 0) || (j == 0)&&(i <= 0)) && v != 0) c[++k] = v;
            k++;
        }
        printf("Case %d:
", ++cas);
        printf("%s + %s = ", a, b);
        for(int i = k-1; i >= 0; --i) printf("%d", c[i]);
        if(T) printf("

");
        else printf("
");
    }
}
View Code

如有疑问,欢迎评论指出!

化繁为简 大巧不工
原文地址:https://www.cnblogs.com/mpeter/p/10384274.html