基于1000000进制大数加法

大数加法

1、简介
      在1000000进制下实现两个大数加法,1000000进制的表示:0-999999,之所以用1000000进制是为了方便计算,同时这也是我们老师要求的。将十进制转成1000000进制,例: 123456789–>123 456789,为便利存储要到一个整型数组n[len],其中len=(InNum+5)/6,就例123456789,那么了n[len-1]=123,n[len-2]=456789,这样就将一个十进制数转成1000000进制。

2、核心代码:将十进制转成1000000进制

   int InNum, c, i, j, k, l;
    char s[Num] = {'0'};//初始化
    InNum = 0;
    i = 0;
    j = 0;//初始化赋值
    while ((c = fgetc(stdin)) != EOF && c != '\n') {//输入数
        if (i < Num)
            s[i++] = c;    //存入字符数组
        else
            break;
    }
    l = strlen(s);
    k = (l + 5) / 6;    //转换成1000000进制时数的长度
    for (i = 0; i < strlen(s); i++) {
        //例: 输入:12345678 格式化:n={'1','2','3','4','5','6','7','8','9'}-->a={123,456789},转化成1000000进制
        InNum = InNum * 10 + s[i] - '0';
        j++;
        if (((i + 1) == (l % 6)) && ((l % 6) != 0)) {    //当输入的数对6取余不为0时,余的长度的数,例:123456789--> 123 456789 ,InNum=123
            a[--k] = InNum;
            j = 0;
            InNum = 0;
            continue;
        }
        if (j % 6 == 0) {    //当输入的数对6取余为0时,例:123456789--> 123 456789 ,InNum=456789
            a[--k] = InNum;
            InNum = 0;
        }
    }

3、完整代码

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

#define Base 1000000
#define Num 21//数组长度,Num-1是限定输入的数的长度

int sum[Num];//和
int n[Num - 1];//一个大数
int m[Num - 1];//一个大数

//读入大数
int ReadNum(int a[Num]) {
    int InNum, c, i, j, k, l;
    char s[Num] = {'0'};//初始化
    InNum = 0;
    i = 0;
    j = 0;//初始化赋值
    while ((c = fgetc(stdin)) != EOF && c != '\n') {//输入数
        if (i < Num)
            s[i++] = c;    //存入字符数组
        else
            break;
    }
    l = strlen(s);
    k = (l + 5) / 6;
    for (i = 0; i < strlen(s); i++) {
        //例: 输入:12345678 格式化:n={'1','2','3','4','5','6','7','8','9'}-->a={123,456789},转化成1000000进制
        InNum = InNum * 10 + s[i] - '0';
        j++;
        if (((i + 1) == (l % 6)) && ((l % 6) != 0)) {    //当输入的数对6取余不为0时,余的长度的数,例:123456789--> 123 456789 ,InNum=123
            a[--k] = InNum;
            j = 0;
            InNum = 0;
            continue;
        }
        if (j % 6 == 0) {    //当输入的数对6取余为0时,例:123456789--> 123 456789 ,InNum=456789
            a[--k] = InNum;
            InNum = 0;
        }
    }
    return (l + 5) / 6;
}

//大数相加
int AddNum(int a[Num - 1], int b[Num - 1], int l) {
    int carry, i, add;
    carry = 0;
    for (i = 0; i < l; ++i) {
        add = (a[i] + b[i])+ carry;    //两数相加,并加上前一次的进位carry
        sum[Num - i - 1] = (add % Base);   //add对Base取余,达到去除当前进位.
        carry = add / Base;    //进位
        if (carry != 0 && i == l - 1) {   //是否进位,且为最后个数
            sum[Num - i - 2] = carry;
        }
    }
    if (carry != 0)    //有进位总长度加1
        return l + 1;
    else
        return l;
}

void PrintNum(int a[Num], int l) {
    int i;
    printf("sum: ");
    for (i = Num - l; i < Num; i++) {
        printf("%06d ", a[i]);
    }
    printf("\n");
}

//主函数
int main(int argc, char *argv[]) {
    int i,lenN, lenM, lenS;
    for (i = 0; i <Num-1 ; ++i) {    //初始化数组
        n[i]=0;
        m[i]=0;
    }
    lenN = ReadNum(n);    //获取第一个数的长度
    lenM = ReadNum(m);    //获取第二个数的长度
    if (lenM >= lenN)     //用长的加短的数
        lenS = AddNum(n, m, lenM);
    else
        lenS = AddNum(m, n, lenN);
    PrintNum(sum, lenS);    //输出结果
}

4、总结
      利用1000000进制来求大数的加法过程相对其他的算法会复杂一些,这涉及到了进制的转换。不过这也算是一种新的尝试吧,之前没有想过这样来做,利用1000000进制来做都是老师提出来的。以前想到的是同样是利用数组,但不用经过复杂的转换,只需将读取的字符串转成整型,然后存进数组就行了。两个整型数组进行逐位相加,然后利用一个数组存相加的结果。就简单说这么多。

5、相关文件:Github

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值