XTU OJ A+B V

31 篇文章 2 订阅

Description

题目描述

小明很喜欢做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

思路分析:将数的运算转化为字符串数组,也就是高精度加法,只不过舍掉了进位罢了 

#include <stdio.h>
#include <string.h> 
int max(int x, int y) {
    if (x > y) return x;
    else return y;
}
int main() {
    int k;
    scanf("%d", &k);
    while (k--) {
            //这道题设计到了一个高精度加法
        char arr[11], brr[11], temp[11];
        scanf("%s %s", &arr, &brr);
        int lena = strlen(arr);
        int  lenb = strlen(brr);
        int lenmax = max(lena, lenb);
        int tempsum, flag = 0, count = 0;
        int a = 0;
        for (int i = 0; i < lena; i++) {
            temp[i] = arr[i];//先将arr中数组的值全部赋值给temp
        }           
        for (int i = 0; i < lena; i++)
        {
            arr[i] = temp[lena - 1 - i];

            //将输入的数据在数组中交换位置                 
        }
        if (lena < lenb) {
            for (int i = 0; i < lenb - lena; i++) {
                arr[lena + i] = '0';
            }
        }
        //交换位置后在后面补0    
        for (int i = 0; i < lenb; i++)
        {
            temp[i] = brr[i];//先将brr中数组的值全部赋值给temp
        }
        for (int i = 0; i < lenb; i++) {

            brr[i] = temp[lenb - 1 - i];//将数组倒置            
        }
        if (lena > lenb) {
            for (int i = 0; i < lena - lenb; i++) {
                brr[lenb + i] = '0'; //交换位置后补0 
            }
        }
        memset(temp, 0, sizeof(temp));

        //现在开始写加法程序
        for (int i = 0; i < lenmax; i++) {
            tempsum = (arr[i] - '0') + (brr[i] - '0');
            tempsum = tempsum % 10;
            temp[lenmax - 1 - i] = tempsum + '0'; //位数相加并调换位置 
        }
        lenmax = strlen(temp);
        //开始写输出程序 
        //需求分析1.000100202020,这种前面的0必须舍弃
        //2. 000000全是0的话只输出一个0 
        //02
                        for(a = 0;a<lenmax;a++){
                            if(temp[a]!='0'){
                                flag = 2;
                                break;
                            }
                            else
                            flag =1;
                         }
                         if(flag ==2){
                         for(int i = a;i<lenmax;i++){//这个运行了很多次
                            printf("%c",temp[i]);
                         }
                        }
                     else if(flag == 1) printf("0");
                         
        printf("\n");



        //}
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值