zoukankan      html  css  js  c++  java
  • 大数加法(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("
    ");
    
    }
    
    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:
    ", i + 1);
            printf("%s + %s = ", strA[i], strB[i]);
    
            Add(strA[i], strB[i], sum);
    
            // 每个样例之间输出空行
            if(i < caseNum)
            {
                printf("
    ");
            }
        }
    
        return 0;
    }
    

    个人主页:

    www.codeapes.cn

  • 相关阅读:
    java 编码问题
    关于时间
    页面
    关于微信
    01-jQuery的介绍
    15-BOM
    14-定时器
    13-JS中的面向对象
    12-关于DOM操作的相关案例
    购物车练习
  • 原文地址:https://www.cnblogs.com/codeapes666/p/12093736.html
Copyright © 2011-2022 走看看