大整数加法

对于一个int类型的整数来说,计算机会用一个32位的2进制数组去存储,数据范围为-2^31
2^31 -1 ,如果数据超出了这个范围,直接对int类型整数做加法就会出现错误,要想实现位数特别大的整数加法,我们需要用字符类型的数组来帮助运算。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void bigDataAdd(char* data_a, char* data_b) {
    int length_a = strlen(data_a);
    int length_b = strlen(data_b);
    int i;
	//因为a跟b位数可能不一样,所以这里做一下处理,如果b的位数大于a,那么交换2数
    char* c = (char*) malloc (sizeof(char) * length_b );
    if (length_b > length_a) {
        for (i = 0; i < length_a; i++) {
            c[i] = data_a[i];
        }
        c[i] = '\0';
        //printf("test:%s %s %s\n",data_a, data_b, c);
        for (i = 0; i < length_b; i++) {
            data_a[i] = data_b[i];
        }
        data_a[i] = '\0';
        //printf("test:%s %s %s\n",data_a, data_b, c);
        for (i = 0; i < length_b; i++) {
            data_b[i] = c[i];
        }
        data_b[i] = '\0';
    }
    //printf("test:%s %s %s\n",data_a, data_b, c);
    free(c);
    length_a = strlen(data_a);
    length_b = strlen(data_b);
    i = length_a - 1;
    int j = length_b - 1;
    int flag = 0;
    //pres数组用于计算结果
    int* pres = ( int *) malloc( sizeof( int) * ( length_a + length_b));
    memset(pres, 0, sizeof( int)*( length_a + length_b) );

    for (; i >= 0; i--, j--) {
        if (j >= 0) {
            pres[length_a - i - 1] += (data_a[i] - '0') + (data_b[j] - '0');
        }
        else {
            pres[length_a - i - 1] += (data_a[i] - '0');
        }
    }
	//进行进位,取余运算
    for (int i = 0; i < length_a + length_b; i++) { 
        if (pres[i] >= 10) {
        	//进位
            pres[i + 1] += pres[i] / 10;                      
            pres[i] %= 10;               
        }
    }
    char* d = (char*) malloc (sizeof(char) * (length_a + length_b) );
    j = 0;
    //d数组用于输出结果,如果需要用到结果,可以将这段代码注释,返回一个char*值
    for (i = length_a + length_b - 1; i >= 0; i--) {
        if (pres[i] != 0) {
            flag = 1;
        }
        if (flag) {
            d[j] = pres[i] + '0';
            //printf("p[%d] = %d, d[%d] =  %c\n", i, pres[i], j, d[j]);
            j++;
        }
    }
    free(pres);
    d[j] = '\0';
    printf("%s\n", d);
    free(d);
}

int main() {
    char str1[100] = {0};
    char str2[100] = {0};
    scanf("%s%s", str1, str2);
    bigDataAdd(str1, str2);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值