XTU-OJ 1215-A+B V

文章讲述了如何通过编程解决一个计算问题,即模拟手算加法过程,避免在给定整数a+b时忘记进位。提供了两种输入类型的代码示例,展示了如何处理字符串和整数类型的输入,最终计算出结果。
题目描述

小明很喜欢做a+b,他但经常忘记进位,所以他算88+12=90,而不是100。 现在你给了小明一些a+b的算式,请问他算出来会是什么?

输入

第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b,0≤a,b≤1e9。

输出

每行输出一个样例的结果,不要输出前导0。

样例输入
3
1 2
5 6
55 55

样例输出
3
1
0

解题思路:模拟手算加法,个位和个位对齐,十位和十位对齐......;先算“突出”来那一部分的,然后算需要 两两相加 的部分,这时就把 相加和 模10(取消进位),两步完成,直接交题。

AC代码:

1、字符串类型输入

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

int K,a,b,flag,i,j;
int lenA,lenB,len,ans;
char strA[12],strB[12];

int main()
{
    scanf("%d",&K);
    while ( K --)
    {  
        ans = 0;
        scanf("%s %s",strA,strB);
        lenA = strlen(strA), lenB = strlen(strB);
        flag = 1, len = lenB-lenA;                          //默认数字 b>a
        if (lenA > lenB)    {flag = 0, len = lenA-lenB;}    //不然 令flag=0
        if (flag)                                           // b>a的情况
        {
            for (i = 0; i < len; i ++)
                ans = ans*10 + (strB[i]-'0');               
            for (j = 0; j < lenA; j ++,i ++)    
                ans = ans*10 + ((strB[i]-'0') + (strA[j]-'0'))%10;
        }
        else                                                // a>b的情况
        {
            for (i = 0; i < len; i ++)
                ans = ans*10 + (strA[i]-'0');
            for (j = 0; j < lenB; j ++,i ++)
                ans = ans*10 + ((strA[i]-'0') + (strB[j]-'0'))%10;            
        }
        printf("%d\n",ans);
    }
}

2、整数类型输入(以前的代码)

#include <stdio.h>

int max(int x,int y)
{
    if (x < y)  x = y;
    return x;
}

int main()
{
    int K;
    int a,b;
    scanf("%d",&K);
    while ( K --)
    {
        int a1[15] = {0};
        int b1[15] = {0};
        int c1[15] = {0};
        int aw,bw;
        scanf("%d %d",&a,&b);
        for (aw = 1; a > 0; aw ++)
        {
            a1[aw] = a%10;
            a /= 10;
//            printf("a1[%d] = %d\n",aw,a1[aw]);
        }
        for (bw = 1; b > 0; bw ++)
        {
            b1[bw] = b%10;
            b /= 10;
//            printf("b1[%d] = %d\n",bw,b1[bw]);
        }
        int m = max(aw,bw);
//        printf("m = %d\n",m);
        for (int i = 1; i < m; i ++)
        {
            c1[i] = a1[i] + b1[i];
            if (c1[i] > 9)  c1[i] -= 10;
//            printf("c1[%d] = %d\n",i,c1[i]);
        }
        
        int ans = 0;
        for (int j = m-1; j >= 1; j --)
        {
            ans =  ans*10 + c1[j];
        }
        printf("%d\n",ans);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值