zoukankan      html  css  js  c++  java
  • 大数加法

    大数加法

    Content

       引言

      可行代码

      自定义函数简介

      写在最后

    引言

    想必readers都学过加法吧!(没学过就去小学一年级预习一下,哈哈哈)。例如:1 + 1 = 2 有手就行。

    之前经过学习我们得知,int可以储存-2^31~~2^31的数,long long、double呢?话不多说,自己查。那么int最大也就只能存储9位数的样子,如果遇到大型数据计算,例如:112233445566778899 + 998877665544332211 就......没办法了吧。

    此处我们引进大数加法,其核心思想是利用字符数组来模拟数字(把单个数字存入数组,用整个数组表示一个数字,真好懂!),之后,拿起小学学的进位加法知识愉快的写代码吧!写完就可以骄傲的说,我会用编程写加法了,真不错!

    温馨提示:可行代码中函数不懂还有函数简介辅助哦 !

    可行代码

     

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    void invert(char *restr, char *wrstr);       // 数字倒序函数
    void addtion(char *number1, char *number2);  // 加法函数
    void reverse_putstr(char *charstr);          // 反向输出数组内数据函数
    const int N = 1005;                          //最大位数控制
    int up, temp;                                //up为记录进位变量, temp记录和(看后文)
    char first_num[N], second_num[N], buffer[N]; // 分别为第一个数字倒序,第二个数字倒序,输入数据载体(正序)
    
    void invert(char *restr, char *wrstr) // 数字倒序函数
    {                                     // restr读入正序数组, wrstr待写入的逆序数组
        for (int i = 0, j = strlen(restr) - 1; j >= 0; j--)
        {
            wrstr[i++] = restr[j] - '0'; // 字符'1'的ASCII码是48,减去'0'便于运算
        }
        return;
    }
    
    void addtion(char *number1, char *number2) // 加法函数
    {
        for (int i = 0, up = 0; i < N; i++)
        {
            temp = number1[i] + number2[i] + up;
            number1[i] = temp % 10; // 取得个位数
            up = temp / 10;         // 取得十位数以进位
        }
    }
    
    void reverse_putstr(char *charstr) // 反向输出数组内数据函数
    {
        bool sign[N]; // 做标记的数组,true表示当前位置是有效数位,否则不是
        int position;
        memset(sign, false, N);
        for (int i = 0; i < N; i++) // 此循环的目的是为了找出结果中最后一位有效数位
        {
            if (charstr[i] + '0' > '0')
                for (int j = 0; j <= i; j++)
                {
                    sign[j] = true;
                    position = i;
                }
        }
        for (int i = position; i >= 0; i--)
        {
            printf("%c", charstr[i] + '0'); // 由于invert()函数执行时first_num内被减去了'0',此处加上
        }
        return;
    }
    
    int main()
    {
        while (1)
        {
            memset(first_num, 0, N), memset(second_num, 0, N); // 初始化数组为0
            cin >> buffer;
            getchar(); // 清空缓冲区
            invert(buffer, first_num);
            cin >> buffer;
            getchar();
            invert(buffer, second_num);
            addtion(first_num, second_num);
            reverse_putstr(first_num);
            cout << endl;
        }
        return 0;
    }

     

     

    自定义函数简介

    写代码注意要点是进位问题,我们使用addtion() 函数计算。temp很好的记录两个加数的和,up可以记录是否进位。但是在进位的过程中会有一个缺憾,就是首位数字有个能是个0(例如first_num = {5},second_num = {5} 经过addtion() 函数处理会是first_num = {0, 1}第一个0便成为了结束符),会导致此0作为字符串结束标识符,以至于无法输出。此问题交给revese_putstr() 解决。

    由于计算要从个位计算,我们应该将数字倒序存储,我们使用invert() 函数反转字符串。invert() 函数中不仅仅将数字倒序,还要注意我们将字符的ASCII码做了一个转换,为何转换?—— 字符 '1' + '1' == 48 + 48 == 96 == '`' 无法达到目的。 

    此外我们还要得到一个正向的result,所以要反向输出,我们使用reverse_putstr() 函数。addtion() 函数介绍中的 5 + 5 问题,为了找到第二位中的 1 我们用做标记的方法实现,sign数组会不断的被第二重循环更新,同时也会记录下最新位置。最后就可以实现反向输出啦,nice。

    自定义函数只是为了简化主函数,使思路更急清晰,建议多使用。

    写在最后

    大数加法只是大数模拟、高精度的冰山一角,还有很大的空间值得探索,各位reader编程路上更加fighting哦 ! 假使reader有什么问题欢迎联系Kirk,Kirk一定会尽力帮忙的。如果想练习这样的题来检验自己也记得私信Kirk啦,还有发现文章有问题、bug也记得和Kirk谈谈哦!

  • 相关阅读:
    Ubuntu 12.10下为Firefox安装Adobe Flash Player
    oracle同时操作两个实例,如何进行切换操作?
    Ubuntu 12.10下为Firefox安装Adobe Flash Player
    Ubuntu11.10 安装oracle 11g
    oracle忘记system和sys账户的密码怎么办?
    linux 搭建java开发环境
    Oracle 笔记 day04
    节约网络带宽的设计策略
    集群化服务器
    01 基础概念(实战Linux Shell编程与服务器管理)
  • 原文地址:https://www.cnblogs.com/kirk-notes/p/14294942.html
Copyright © 2011-2022 走看看