C语言学习趣事_大数运算_之加法

1、引子
   在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并且由于计算机的运算的特殊性: 按位进行计算的,这样还带来了一个问题,存在数的丢失,就是通常说的溢出。
   为了在C中进行大数运算,不能简单的用C中预定义的数据类型和运算方法进行,因此必须寻求一种新的方法。本文讨论怎样来设计一种方法来计算各种大数运算。
2、加法
   我们知道,实际上计算机通过位运算来实现数学运算,我们通过一个简单的例子来说明这个问题。
Exp:
     100   ————>   0110_0100  (为了简单的表示运算我们假设运算量是占用一个Byte的)
      50   ————>   0011_0010
    +               +
————————————————————
     150              1001_0110
通过上面的例子我们可以看到,其实我们就可以得到启发,我们在进行数学运算的时候,是否也可以“按位”进行处理呢? 是否可行,我现在也不知道,但是这给了我们一个思路。
3、大数加法的思路
  在进行加法的时候,我们不需要关注本身数字的大小,而只需要关心组成数字的每一个数学符号就行, 例如我们有两个数, 13和12, 我们不必要关心13表示距离0的距离为13这个基本的意义, 我们只需要关注这里有两个数符占据了个位、十位就行,同样12一样处理,当我们进行数学运算的时候我们就按照每个位进行计算就行,
Exp:
     13  ————>    1      3
     12  ————>    1      2
   +               +
————————————————————
     25              2       5
我们最终将: 2和5  分别放到对应的基位占位符上就行, 把2 放到十位, 把5放到个位,结果可以得到: 25。对于更多或者任意位的数学加法运算我们都可以按照这样的思路处理。
4、设计数据结构
   我们知道在计算机世界里面有一个经典的说法,我忘记是否是冯若-依曼说的了,那就是:
               程序=数据结构+算法
   为了实现这样的运算我们需要进行设计一个特殊的数据结构,很显然用结构体比较合适,因为我们不知道到底会输入多少位的数字,因此为了实现任意位的数学运算我们需要用到基本的数据组织形态,就是链表。(在计算机存储能力最大限度之内的运算均可通过这种方法实现)。
定义数据结构:
Exp:
 typedef  struct  Node_Sum
    {
        char  chInput;                //用来存储每一位的输入字符
        unsigned int cFlag;           //用来表示每一位相加是否有进位
        struct Node_Sum   *Next;      //用来指向输入的下一个节点
    } NODESUM;
5、申请存储空间
  既然没有办法预定义用户的输入长度,那么我们只能是动态申请内存了。
我们可以用下面的函数实现动态内存申请:
Exp:
  NODESUM *get_memory(void)
  {
      return (NODESUM *)malloc(sizeof(NODESUM));
  }
6、保存用户输入
  可以利用循环读入字符的原则来实现用户的输入;
 
     char chInput;
     NODESUM  *nodesum;
     while((chInput=getchar()) != ' '|| chInput != 0x0D )
        {
             nodesum->next=get_memory();
             nodesum->chInput=chInput;
        }
 
7、转换数据的
  因为我们输入的数字是按照高进制位从左到有输入的,这里我们输入也是由左往右输入的,正好与数字相对称,但是这里会引起一个问题,那就是当我们
输入的加数和被加数的位数不一致的情况,将会影响到我们两个数的相加运算。这里有三个方法来处理这种情况:
    1、是将两个链表都倒置一下,然后进行相加,相加后再将结果倒置输出
    2、就是将短的那个进行从左开始补零,直到两个数的位数一致。

3、就是将输入的字符串进行右对齐,然后进行操作。
Exp:
    123456789
    000000012
+
————————————

从算法的简单性和运算的时间上来看,我们知道用第二种方法更加简单。
8、计算
   最后一步进行计算,这个就简单了,我们可以用字符进行计算,也没有必要转换成十进制的数据进行计算。这里需要用到一点关于ASCII码的知识,需要
一张ASCII码表进行对照。
   查表知道:
            字符0 ——>  0x30
            字符9 ——>  0x39
因此如果两个字符相加大于0x69就表示相加的位有进位,我们设置我们的进位标志位为1;否则就不置位进位标志位,使其为0;当进行下一个计算的时候我们将进位标志
位同时将进位标志位也进行相加,加完后清楚进位标志位就可以实现我们的整个相加的过程。
9、实例代码
  这里我们设计一个最多可以实现100位数的加法运算程序,如果更多的数据位,我们就不讨论了。留待有兴趣的进行讨论。这里给出一个简单数组实现的代码,如果将代

码进行修改就可以实现想要的数据长度的计算。

Exp:

/*
*     程序实例演示100位大数加法的运算
*
*/#include <stdio.h>
#include <ctype.h>#define LENGTH 100
#define NUL  0x0int main(int argc,char **argv)
{char aug_end[LENGTH],   //加数add_end[LENGTH],   //被加数sum[100];          int cFlags,  //进位标志位temp,    i,j,i_aug_len,  //加数的位数i_add_len,  //被加数的位数ch_2_i_aug,  ch_2_i_add;//初始化数组i=0;while(i<100){aug_end[i]=NUL;add_end[i]=NUL;sum[i]=NUL;i++;}//输入加数i=0;i_aug_len=0;printf("Please input the augend:");while(isdigit(temp=getc(stdin))){aug_end[i]=temp;i++;i_aug_len++;if(i>=100)break;}fflush(stdin);//数据对齐,将输入数据右对齐for(i=100-i_aug_len;i>0;i--)for(j=100-i;j>=0;j--){aug_end[j+1]=aug_end[j];}i=100-i_aug_len;while(i>=0){aug_end[i-1]=0x30;i--;}  //输入被加数i=0;i_add_len=0;printf("Please input the augend:");while(isdigit(temp=getc(stdin))){add_end[i]=temp;i++;i_add_len++;if(i>=100)break;}fflush(stdin);//数据对齐,将输入数据右对齐for(i=100-i_add_len;i>0;i--)for(j=100-i;j>=0;j--){add_end[j+1]=add_end[j];}i=100-i_add_len;while(i>=0){add_end[i-1]=0x30;i--;}   //进行加法运算,按照位置进行计算,从右向左运算cFlags=0;  //首次运算置位进位标志位为0for(i=99;i>=0;i--){   ch_2_i_aug=aug_end[i]-48;   // char ——》 intch_2_i_add=add_end[i]-48;   temp=ch_2_i_aug+ch_2_i_add+cFlags;   if(temp >=10){   //如果进位了,就应该将个位数取出来,同时将进位标志位置1cFlags=1;   temp-=10;}else{cFlags=0;}sum[i]=temp+48;   // int ——》 char}//输出运算结果puts("\nThe sum of the augadd and addend is:");if(cFlags==1)putc('1',stdout);for(i=0;i<100;i++){if(isdigit(sum[i]))putc(sum[i],stdout);}putc('\n',stdout);return 0;
}

转载于:https://www.cnblogs.com/volcanol/archive/2011/10/03/2198492.html

C语言学习趣事_之_大数运算_加法相关推荐

  1. C语言学习趣事_你不知道的C语言应用

    一.引 我一直不明白"文人相轻"是什么意思,也许就是说:文人清客之间互相瞧不起的事情吧.但对于我来说,文人相轻就是表示:无知者无畏. 无论你的某一方面的语言学的怎么样,怎么样的牛逼 ...

  2. 数据结构背包问题c语言思路,C语言学习趣事_数据结构_经典命题_1_背包问题_分析_1...

    /*1.问题描述 假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,-wn的物品, 能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+-+wm=T, 要求找出所有满足上述条件的解. 例 ...

  3. 大数运算_求1000的阶乘(C语言实现)

    以下是简易的代码,因为受数据类型的限制,所以表示的数据范围有限, 故在表示大数据的时候,应该采用数组存储. 同时,在采用数组存储的时候,应该将数组声明为全局变量或static修饰,这样做的目的是使分配 ...

  4. 【C语言学习趣事】_GCC源代码分析_2_assert.h

    我记得在以前的一篇随笔中,我堆windows下的<assert.h>进行了分析,今天我们来看看gcc中这个文件的定义是怎样的. [1]assert宏的作用 assert宏实现断言的作用,一 ...

  5. R语言学习:数据读取以及简单运算

    这是去年业余时间学到的R语言基础知识,打算入门的朋友可以进来看看,大佬请绕道. 这一章记录的是关于R语言数据的读取和一些简单的运算方法. 如有疑问,欢迎留言说明. 数组的基础知识 判断是否是数组is. ...

  6. python字符串与列表与运算_[Python学习笔记1]Python语言基础 数学运算符 字符串 列表...

    这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...

  7. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  8. C语言学习笔记第五天_项目训练

    C语言学习笔记第五天_项目训练 添加自定义的一个函数库文件 <getch.h> 步骤: 1.在windows中把getch.h放入共享文件夹(文件我放在文末,自取) 2.在Ubuntu终端 ...

  9. c语言用位运算将一个数清零,C语言学习笔记_位运算

    C语言学习笔记_位运算 知识点记录 基本位运算 按位与:全1为1,见0为0:与1相与无变化,与0相与变为0:可用于特定位清零 按位或:见1为1,全0为0:与1相或变为1,与0相或无变化:可用于特定位置 ...

最新文章

  1. shell 中| || () {} 用法以及shell的逻辑与或非
  2. swift_022(Swift 的下标脚本)
  3. java log4j mysql_java – 配置log4j属性文件以存储在mysql数据库中
  4. Nginx的安装和配置文件详细说明
  5. (原创)c++中的类型擦除
  6. Android之用Intent.FLAG_ACTIVITY_CLEAR_TOP解决界面重复拉起问题
  7. 318. Maximum Product of Word Lengths
  8. mysql脚本执行中文乱码_MySQL从命令行导入SQL脚本时出现中文乱码的解决方法
  9. python获取同音字
  10. hql删除mysql语句_hibernate hql删除异常
  11. java zip 压缩文件夹_java来实现zip压缩文件或者文件夹
  12. leetcode485、448、414
  13. 理解list和vector的区别
  14. python_使用需要的气象台站提取气象数据
  15. 【产品经理】产品经理进阶之路-大纲
  16. Vue笔记 (一) Vue的MVVM
  17. 手机APP支付--整合银联支付控件
  18. 猫和老鼠服务器维护多久结束,猫和老鼠手游:长时间不玩游戏,再次进入游戏后会发生这些事...
  19. 最近今日头条上真的是「哀鸿遍野」啊
  20. 【转】珍藏多年的素材,灵感搜寻网站

热门文章

  1. 利用OpenCV进行边缘检测
  2. 构建Chua 混沌电路 - 基本测试
  3. PN结中存在的Boltzmann常数
  4. html模板编辑器,可视化编辑网站模板
  5. java 网络通信协议_JAVA-基础-网络通信协议
  6. js和html邮箱注册的正则,js邮箱正则表达式
  7. 架空输电线路运行规程_[精品课程]绝缘子及其设计架空输电线路设计
  8. mysql事务处理 begin_mysql 事务处理
  9. linux网站配置文件,Linux网站服务器配置文件
  10. php约瑟夫问题,php 解决约瑟夫问题实现方法