十进制大数的加法运算

输入:输入的第一行为一个整数N,表示有N组数据。每组数据最多包含100行。每行由一个非常长的十进制整数组成,该整数的长度不会超过100个字符而且只包含数字,每组的数据的最后一行为0,表示这组数据结束。每组数据之间有一个空行。

输出:对于输入的每组数据,输出它们的和。每两组数据的输入之间有一个空行。


分析:

本题对每一位进行求和的时候,可以采用字符形式,也可以采用整数形式。

但是根据经验......用整数处理起来更方便哦。

需要注意以下两点:

1、每一位计算和的时候,得到的进位可能大于1。

2、累加各大数得到的和,其位数可能会比参与运算的大数的位数还要多。

因为参加求和运算的大数的个数不会超过100个,因此如果参与求和运算的大数的最大长度为maxlen,那么求和结果长度不会超过maxlen+2。那么求和的时候只需要一直求和到maxlen+2位,然后去掉后面的0,再以相反的顺序输出各位整数就行啦。


代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int main(){
    char buffer[200];//以字符形式存储读入的每一个整数
    int array[200][200];//逆序后的大数以及求得的和
    int answer[200];
    int i,j,k;
    int num_integers;//读入的整数的个数
    int len,maxlen;//每个整数的长度以及这些整数的最大长度
    int sum,carry,digit;//每位求和运算后得到的总和、进位以及该位的结果
    int N;
    scanf("%d", &N);
    for(k = 1; k <= N; k++)
    {
        maxlen = -1;
        memset(array, 0, sizeof(array));
        memset(answer, 0, sizeof(answer));
        for(num_integers = 0; num_integers < 200; num_integers++)
        {
            gets(buffer);
            if(strcmp(buffer, "0") == 0) 
                break;
            len = strlen(buffer);
            if(len > maxlen)
                maxlen = len;
            for(i = 0; i < len; i++)
            {
               array[num_integers][i] = buffer[len - 1 - i] - '0';//逆序存放大数的每位(整数形式)
            }
        }
        carry = 0;
        for(i = 0; i < maxlen + 2; i++)
        {
            sum = carry;
            for(j = 0; j < num_integers; j++)
                sum += array[j][i];
            digit = sum % 10;
            carry = sum / 10;
            answer[i] = digit;
        }
        for(i = maxlen + 2; i >= 0; i--)
        {
            if(answer[i] != 0)
                break;
        }
        while(i >= 0)
            printf("%d",answer[i--]);
        printf("\n");
        if(k < N)
            printf("\n");
    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值