大整数加法 - C语言

大整数加法

问题描述

  • 问题描述:求两个不超过200位的非负整数的和。

  • 输入
    多组测试数据。每组测试数据包括两行,每行一个数。

  • 输出
    一行,即相加后的结果。结果里不能有多余的前导0。

  • 样例输入
    22222222222222222222
    33333333333333333333

  • 样例输出
    55555555555555555555

问题分析

  1. 输入要求整数不超过两百位,该整数有可能超出了int的表示范围,因此不能使用int类型的变量接收,应使用字符串接收整数。

  2. 大整数加法的原理:两个整数从个位开始相加,如果相加结果大于10,则下一位进1,依此类推。

  3. 为了实现加法运算,我们将接收到的字符串转换为用int类型的数组接收,数组每个元素对应整数的每一位,且数组最低位对应整数的最低位,即数组下标0处对应整数的个位,下标1处对应十位,依此类推。

  4. 最后输出时要去除前导0,原理:从最高位开始寻找第一个不为0的数字,并记录该数字所在下标,之后从该下标开始向低位遍历输出。

代码实现

1.字符串转化

void strToNum(char* str, int* num, int sz)
{
    int i = 0;
    int j = 0;
    for (i = sz - 1; j < sz; i--)
    {
        num[j++] = str[i] - '0';//char类型转化为int类型
    }
}

2.逐位相加

void sum(int* num1, int* num2, int max)//max - 两个数中最大的位数
{
    int i = 0;
    for (i = 0; i < max; i++)//从最低位到最高位遍历
    {
        num1[i] += num2[i];
        if (num1[i] >= 10)//相加结果如果大于10,,该位取模10,下一位加1
        {
            num1[i] = num1[i] % 10;
            num1[i + 1]++;
        }
    }
}

3.输出

void printNum(int* num, int sz)//去除前导0并输出
{
     int i = 0;
    for (i = sz; i > -1; i--)//去除前导0
    {
       if(num[i])
        {
            break;
        }
    }
    for (; i > -1; i--)//从第一个不是0的数开始输出
    {
        printf("%d", num[i]);
    }
    printf("\n");
}

4.main函数环境

int main()
{
    char strNum1[201] = { 0 };//接收整数
    char strNum2[201] = { 0 };
    int num1[201] = { 0 };//接收转化后的整数
    int num2[201] = { 0 };
    printf("请输入两个整数:\n");
    while (scanf("%s %s", strNum1, strNum2) != EOF)//多组输入
    {
        int sz1 = strlen(strNum1);//计算整数的位数
        int sz2 = strlen(strNum2);
        strToNum(strNum1, num1, sz1);
        strToNum(strNum2, num2, sz2);
        int max = (sz1 > sz2) ? sz1 : sz2;//获取两个整数中较大的位数
        sum(num1, num2, max);
        printf("结果为:\n");
        printNum(num1, max);
    }
    return 0;
}

5.头文件

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

运行结果

大整数加法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值