2023-10-26 用C语言实现一个大整数加法


点击 快速C语言入门


用C语言实现一个大整数加法

  • 前言
  • 一、思路和代码设计
    • 数字对齐:
    • 字符对齐:
  • 二、代码
  • 总结


前言

要解决问题: 实现大整数加法

想到的思路: 用字符代替数字, 逐个计算, 过10进位.

其它的补充: 同样思路可以解决减法, 乘法, 但除法没有想到如何解决.


一、思路和代码设计

C语言的整型都是有位数限制的, 用字符代替整型进行计算, 然后输出可能是比较直接的解决思路.

加法有两个问题要解决, 对齐以及进位.

加法算式是右对齐, 字符串则是左对齐, 比较可行的方案是字符串计算前倒置, 算出结果后再倒置回来.

数字对齐:

2023-10-26 用C语言实现一个大整数加法_第1张图片

字符对齐:

2023-10-26 用C语言实现一个大整数加法_第2张图片

进位则要将相应位置的结果除以十, 余数留下, 商作为一个修正, 和向后移动一位字符的位置的数字计算结果相加.

二、代码

#include 
#include 

#define MAX_LEN 1024

char lhs[MAX_LEN];
char rhs[MAX_LEN];
char result[MAX_LEN];

int reverse(char *str);
void add(char *lhs, char *rhs, char *result);

int main()
{
    scanf("%s %s", lhs, rhs);
    add(lhs, rhs, result);
    printf("%s\n", result);
    return 0;
}

int reverse(char *str)
{
    const int len = (int)strlen(str);
    char temp;

    for (int i = 0; i != len / 2; i++)
    {
        temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }

    return len;
}

void add(char *lhs, char *rhs, char *result)
{
    int lhsLen = reverse(lhs);
    int rhsLen = reverse(rhs);

    int carry = 0;
    const int ten = 10;

    for (int i = 0, j = 0, sum; i < lhsLen || j < rhsLen; i++, j++)
    {
        sum = (i < lhsLen ? lhs[i] - '0' : 0) +
              (j < rhsLen ? rhs[j] - '0' : 0) + carry;

        result[i] = (char)(sum % ten + '0');

        carry = sum / ten;
    }

    int maxLen = lhsLen > rhsLen ? lhsLen : rhsLen;

    if (carry > 0)
    {
        result[maxLen++] = (char)(carry + '0');
    }

    result[maxLen] = '\0';

    reverse(result);
}

总结

用C语言实现大整数加法, 就是将数学的基本运算翻译为程序, 可能实现的效率不一定很高, 相比较整型原生的计算, 但作为一个学习材料还是可以的.


点击 快速C语言入门


你可能感兴趣的:(笔记,c语言,算法,开发语言)