大数加法(A + B Problem Plus)问题

解题思路

两个⼤数可以⽤数组来逐位保存,然后在数组中逐位进⾏相加,再判断该位相加后是否需要进位。为了⽅便计算,可以把数字的低位放到数组的前面,高位放在后面。

样例输入

3
18 22
56 744
53234673473 7544645548767

样例输出

Case 1:
18 + 22 = 40

Case 2:
56 + 744 = 800

Case 3:
53234673473 + 7544645548767 = 7597880222240

代码实现

#include<stdio.h>
#include<string.h>
#define NUM_MAX 1000                // 大数的最大位数
#define CASE_MAX 100                // 示例的最大值

/*
大数加法 
参数: 
str1为第一个大数,用字符数组保存
str2为第二个大数
sum数组保存相加的结果  即:str1+str2=sum
返回值:返回数组sum的有效长度,即计算结果的位数 
*/

void Add(char* numA, char* numB, int* sum)
{
    int k = 0;
    int l = 0;
    int array[NUM_MAX] = {0};
    int lenA = strlen(numA);            // 计算数组numA的长度,即数A的位数
    int lenB = strlen(numB);            // 计算数组numB的长度,即数B的位数

    int maxLen = lenA > lenB ? lenA : lenB;     // 取两个数中大的位数

    // 将numA字符数组的数字字符转换为整型数字,且逆向保存在整型数组sum中,即低位在前,高位在后
    for (int i = lenA - 1; i >= 0; i--)
    {
        sum[k++] = numA[i] - '0';
    }

    // 转换第二个数
    for (int j = lenB - 1; j >= 0; j--)
    {
        array[l++] = numB[j] - '0';
    }

    // 两个数相加
    for (int i = 0; i <= maxLen; i++)
    {
        sum[i] += array[i];             // 两个数从低位开始相加
        if (sum[i] > 9)                 // 判断是否有进位
        {
            sum[i] %= 10;
            sum[i+1]++;
        }
    }

    if (sum[maxLen] != 0)               // 判断最高位是否有进位
    {
        maxLen++;
    }

    // 逆向输出求和的结果
    for (int i = maxLen - 1; i >= 0; i--)
    {
        printf("%d", sum[i]);
    }
    printf("\n");

}

int main()
{
    int caseNum = 0;

    scanf("%d", &caseNum);
    if (caseNum < 1 || caseNum > 100)
    {
        return 1;
    }

    char strA[CASE_MAX][NUM_MAX] = {0};
    char strB[CASE_MAX][NUM_MAX] = {0};

    for (int i = 0; i < caseNum; i++)
    {
        scanf("%s%s", strA[i], strB[i]); 
    }

    for (int i = 0; i < caseNum; i++)
    {
        int sum[NUM_MAX] = {0};                 // 存放计算的结果,低位在前,高位在后,即sum[0]是低位
        printf("Case %d:\n", i + 1);
        printf("%s + %s = ", strA[i], strB[i]);

        Add(strA[i], strB[i], sum);

        // 每个样例之间输出空行
        if(i < caseNum)
        {
            printf("\n");
        }
    }

    return 0;
}

个人主页:

www.codeapes.cn

posted @ 2019-12-24 21:44  Codeapes  阅读(301)  评论(0编辑  收藏  举报