欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言实现大数相加的代码问题

程序员文章站 2022-04-28 08:57:21
...

一.为什么会出现大数相加的问题

  1. C语言是面向过程的一门语言,它并不像java一般拥有众多方便的方法,因此大多数的代码都要依靠程序员本身进行实现。此篇便是针对C语言无法实现大数相加进行书写的(不喜勿喷),int longlonglong~unsigned long long 均有对应的数据长度上限,因此便有了大数相加的问题。

二.大数相加所要掌握的知识

本代码涉及数组,及字符串的一些基本函数,基本的c语言的一些语句。
函数的定义方法(掌握或不掌握均可以)。

三.大数相加的思路

  1. 使用字符串进行大数的储存。
char str1[numb],str2[numb];
 scanf("%s%s",&str1,&str2);

2.引入三个数组作为字符串转为数字的容器,和最终计算结果的容器(可适当的根据位数设定数组大小),并引入变量计算字符串的长度(即大数的位数)。

int numb1[numb]={0},numb2[numb]={0},numb3[numb]={0};//numb即为定义的数组大小,并对其进行初始化
int leg1,leg2,leg3;
 leg1=strlen(str1);//利用c中本身的函数计算字符串的长度
    leg2=strlen(str2);

3.将字符串转为数字类型存入数组类型,此处需要明白利用ASCII码将字符转为数字的原因(此处不再解释)

  for(int i=leg1-1,j=0; i>=0;i--,j++) {
        numb1[j]=str1[i]-'0';
    }
    for(int i=leg2-1,j=0; i>=0;i--,j++) { //倒叙储存的原因是为了此后进行计算方便,进行更易的进位。
        numb2[j]=str2[i]-'0';
    }

假如大数为123456789
987654321
储存的方式如图所示
例图
C语言实现大数相加的代码问题
4.便为最关键的进位问题,10进制数满10进一,因此在每一次进行对应数组位相加(引入临时变量temp)时便要考虑进位问题(此处我采用的是for循环),将相加的结果放入数组三。话不多说上代码。

for(int i=0;i<max(leg1,leg2);i++){//判断需要进行加法的位数
        int temp;
        temp=numb1[i]+numb2[i];
        if(temp>=10){
            numb3[i]+=temp-10;
            numb3[i+1]++;
        }
        else{
            numb3[i]=temp;
        }
    }

5.最后一步便是最终结果的输出,因为相加后的结果是倒叙,只需将结果倒叙输出就可实现,(但需考虑大数最高位的进位问题,小编运用了数组的性质(即在未赋值的地方位’\0’)进行判断),而后进行了输出

 for(leg3=0;numb3[leg3]!='\0';leg3++){
    }
    for(int i=leg3-1;i>=0;i--){
        printf("%d",numb3[i]);
    }    
    }

四.整理代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define numb 10000
void main()
{
    int max(int a, int b);
    int leg1, leg2, leg3;
    char str1[numb], str2[numb];
    int numb1[numb] = { 0 }, numb2[numb] = { 0 }, numb3[numb] = {0};
    scanf("%s%s", &str1, &str2);
    leg1 = strlen(str1);
    leg2 = strlen(str2);
    for (int i = leg1 - 1, j = 0; i >= 0; i--, j++) {
        numb1[j] = str1[i] - '0';
    }
    for (int i = leg2 - 1, j = 0; i >= 0; i--, j++) {
        numb2[j] = str2[i] - '0';
    }
    for (int i = 0; i < max(leg1, leg2); i++) {
        int temp;
        temp = numb1[i] + numb2[i];
        if (temp >= 10) {
            numb3[i] += temp - 10;
            numb3[i + 1]++;
        }
        else {
            numb3[i] = temp;
        }
    }
    for (leg3 = 0; numb3[leg3] != '\0'; leg3++) {
    }
    for (int i = leg3 - 1; i >= 0; i--) {
        printf("%d", numb3[i]);
    }
}
int max(int a, int b) {
    return a>b?a:b;
}

五.运行实例

C语言实现大数相加的代码问题
第一次写博客,还请诸位多多关照。