HDU1002

最简单的模拟题,没什么好说的,模拟加法运算,但是细节很重要。

对于比较边缘的数据,如:99+1  99+111要着重关注

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char num1[1010], num2[1010];
int size1 = sizeof(num1), size2 = sizeof(num2);
char c_num1[1010], c_num2[1010];

int main()
{
#if 0
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif // 1
    int T, cou = 0, len1, len2, s_len, b_len, i, t, tt, first = 1;
    char *big, *small;
    while (~scanf("%d", &T)) {
        while (T--) {
            memset(num1, 0, size1);   ///对两个字符串初始化,全部赋值0,方便两字符串数组直接相加
            memset(num2, 0, size2);

            scanf("%s %s", num1, num2);

            strcpy(c_num1, num1);   ///备份数组,最后输出时用
            strcpy(c_num2, num2);

            len1 = strlen(num1);
            len2 = strlen(num2);
            if (len1 > len2) {     ///找出较长的数组,作为相加的根基
                big = num1;
                small = num2;
                b_len = len1;
                s_len = len2;
            } else {
                big = num2;
                small = num1;
                b_len = len2;
                s_len = len1;
            }

            strcpy(big, strrev(big));      ///利用库函数进行字符数组倒置,再拷贝回原数组,原因是加法竖式运算的时候是右对齐,而字符数组是左对齐
            strcpy(small, strrev(small));

            tt = 0;    ///用于存储进一

            for (i = 0; i < b_len; i++) {     ///直接以长的字符数组的长度为准直接相加,因为对数组初始化了,除了输入的字符,其他全为0即'\0',注意不是'0'
                if (i < s_len)
                    t = big[i] - '0' + small[i] - '0' + tt;    ///数字字符到数字的转换,注意此时两个都是数字字符
                else
                     t = big[i] - '0' + small[i] + tt;      ///数字字符到数字的转化,注意此时big[i]是数字字符,而small[i]为0即'\0'
                if (t >= 10) {
                    big[i] = t % 10 + '0';
                    tt = 1;
                } else {
                    big[i] = t + '0';
                    tt = 0;      ///不要忘记在没有进位时重新赋值0
                }
            }
            if (tt) {
                big[i] = '1';    ///对于最后一位是否进一的判断赋值
            }

            strcpy(big, strrev(big));

            if (!first) puts("");    ///空行
            if (first) first = 0;
            printf("Case %d:\n", ++cou);
            printf("%s + %s = ", c_num1, c_num2);
            if (tt) {
                puts(big);
            } else {
                puts(big);
            }
        }
    }
    return 0;
}


你可能感兴趣的:(模拟,ACM,hduoj)