超长整数的加减法运算

我们所熟知的基本数据类型中,long long 超长整型是表达最大整数的数据类型,但是当我们处理超过这个类型的数据范围时,我们可以用顺序串来处理超长整数的运算,下面我将举例200位以内的整数加减法的实现过程

#include <stdio.h>
#include <string.h>
#define MaxSize 200
typedef struct figure{char data[MaxSize];     //存放整数(逆序存放) int len;                //记录整数长度
}Count;

以上代码,用来声明存放超长整数的数据结构

int main(){Count front, behind; input(&front,&behind);add(&front,&behind); sub(&front,&behind);return 0;
}
void input(Count *front, Count *behind){   //输入两个整数 char first[MaxSize], second[MaxSize];int i, n = 0;printf("请输入两个超长整数(分行输入):\n");fflush(stdin);gets(first);gets(second);for(i = strlen(first) - 1; i >= 0; i--){front->data[n++] = first[i];                   //逆序存放前者整数 }front->data[n] = '\0';front->len = strlen(first);for(i = strlen(second) - 1, n = 0; i >= 0; i--){behind->data[n++] = second[i];                  //逆序存放后者整数 }behind->data[n] = '\0';behind->len = strlen(second);
}

这里需要注意:我们实际存入的整数在顺序串中是逆序存放的,例如输入
123323<回车>
2323<回车>
front->data字符数组中为: 323321\0
behind->data字符数组中为:3232\0

void add(Count *front, Count *behind){  //加法运算 int longer, i, first, second, ahead = 0;longer = front->len > behind->len ? front->len : behind->len;char result[longer+1]; //相加结果的长度等于较长整数长度加1 for(i = 0; i < longer; i++){if(i > front->len - 1) first = 0;else first = (int)front->data[i] - (int)'0';if(i > behind->len - 1) second = 0;else second = (int)behind->data[i] - (int)'0';result[i] = (first + second + ahead) % 10 + '0';if(first + second + ahead >= 10)  ahead = 1; else ahead = 0;if(ahead == 1 && i == bigger - 1){result[++i] = '1';}}result[i] = '\0';printf("相加得:");for(i = strlen(result) - 1; i >= 0; i--){  //逆序输出 printf("%c",result[i]);}
}

在进行算法之前,我们需要总结出加法的运算规律,还有考虑容易被我们忽略的结果(下面是模拟字符数组中的运算过程):
(示例一):不同长度整数之和
2 3 4
4 8 6 4 3 +
——————
6 1 1 5 3
也就是432 + 34684 = 35116
(示例二):同长度,结果进位的情况
9 9 9
6 6 6 +
——————
5 6 6 1
也就是999 + 666 = 1665

void sub(Count *front, Count *behind){   //减法运算 int first, second, i, flag = 0;  //flag = 0表示正数 if(front->len == behind->len){for(i = front->len - 1; i >= 0; i--){if(front->data[i] < behind->data[i]){flag = 1;sub_deal(behind,front,flag);              //同长度,并且前者比后者小,结果为负数,flag = 1 break;} } if(flag != 1) sub_deal(front,behind,flag);        //同长度,并且前者比后者大,结果为正数,flag = 0 }if(front->len > behind->len)  sub_deal(front,behind,0);       //前者比后者长度大 ,说明结果为正,flag = 0else if (front->len < behind->len) sub_deal(behind,front,1);  //前者比后者长度小,结果为负数
}
void sub_deal(Count *a, Count *b, int flag){ //处理较大的数与较小的数相减的问题,实现算法 int i = 0, back = 0, first, second, longer;char result[a->len+1];longer = a->len;while(i < longer){if(i > b->len - 1) second = 0; //超出较小整数长度的,second赋值为0,符合运算法则 else second = (int)b->data[i] - (int)'0';   first = (int)a->data[i] - (int)'0';if(first - second + back < 0){first = (int)a->data[i] - (int)'0' + 10;result[i++] = (first - second + back) + '0';back = -1;} else{result[i++] = (first - second + back) + '0';back = 0;}}if(flag == 1){            //如果flag = 1 表示相减的结果是负数,需要加一个'-'字符 result[i++] = '-';}result[i] = '\0';printf("\n相减得:");for(i = strlen(result) - 1; i >= 0; i--){printf("%c",result[i]);}
}

同样地,减法运算考虑的情况比加法多得多,在该程序中支持较小整数减较大整数的情况,在实际操作减法中,无论是哪种情况,我们发现:
(1) 199 - 200 = - (200-199)
(2) 19 - 4343 = -(4343 - 19)
(3) 200 - 199 = +(200 - 199)
参考上述例子,我们得出我们仅仅只需要控制结果的正负,剩下的按照较大数减去较小数所得出的结果,然后在结果的前面加上正负号即可,所以我们使用了sub_deal()函数大大简化了程序代码的重复性。

运行结果:


总得来说:发现运算法则的规律,考虑所有出现的情况,归纳其共同点.利用变量或函数间接表达同一性,达到简化程序、优化程序的效果!

关于实现超长整数运算相关推荐

  1. 大数除法(超长整数运算除法器)详解

    在大数运算中,比较难实现的应该是高精度/高精度的除法器. 目录 一.原理 二.具体代码解析 三.超长整数运算 一.原理 1.大数存储 先说说大数在C语言程序中是怎么存储的.我们使用长度为N的int数组 ...

  2. C#实现超长位整数运算

    .net中我们可用的最大长度数据类型为ulong(无符号64位). 某些特殊情况下(如密码学),要求我们使用大于64位长度的超长整数进行加.减.乘.除,甚至求幂等诸多复杂运算. 针对于此种情况,.ne ...

  3. 廖雪峰Java1-2Java程序基础-3整数运算

    1.四则运算规则 int i =(100 + 200) * (99 -88);//3300int n = i + 9;//3309//除法结果为整数int q = n / 100;//33//除数为0 ...

  4. java 大整数编程_Java编程--RSA算法中的大整数运算

    Java编程–RSA算法中的大整数运算 RSA原理浅析 RSA是利用陷门单向函数实现的,其安全基础依赖于大整数的分解问题的难解性 算法过程 为了加深对RSA算法的了解,接下来通过简单的一个例子来分析一 ...

  5. python整数运算_深入 Python (6) 整数对象的数学运算

    整数的基本运算 上一节讲到,在 PyLong_Type 中定义了整数类型的各种属性,比如整数类型的名称 "int".整数对象最常用的是一些数学运算,整数对象当然也是支持这些方法的, ...

  6. 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1821 解决:528 题目描述: Today, facing the rapid development of business, SJTU ...

  7. stm32c语言arctan函数,超高速的反正切算法,纯整数运算

    回复: 112 超高速的反正切算法,纯整数运算 (132093786) 出0入0汤圆 电梯直达 发表于 2017-3-14 14:52:38 | 只看该作者 |倒序浏览 |阅读模式 本帖最后由 s1j ...

  8. 整数运算、浮点运算与溢出

    1. 一个示例 sizeof(int) == 4 的机器上,也即 32 位机器,使用 int 型变量存储 200*300*400*500 会得到 -884901888.这显然违犯了整数运算的特性,计算 ...

  9. 计算:光速运行一年的长度是多少米?(测试整数运算溢出)

    //3.整数运算溢出//计算:光速运行一年的长度是多少米? 光速:30000000m/s//整数字面量是int类型,但是计算结果超出int取值范围,溢出(解决方案,把其中一个数加后缀L,不能在最后面加 ...

最新文章

  1. 一份火爆全网的刷题笔记分享!offer 到手!
  2. 【Matlab】如何对二维矩阵进行线性/非线性插值?
  3. python判断火车票座位_Python抢票程序优化,可以选择车次和座次
  4. Python中socket入门例子
  5. Nagios监控平台完全攻略 (三)
  6. 网上偶看一文,有感。特贴在下面。
  7. C#字节数组的常用解码处理方法
  8. SSM+Dubbox电商项目 - 品优购mall
  9. 全纯函数导数的几何意义
  10. HTML5接入百度地图并搜索定位
  11. Linux下查看CPU、内存、磁盘使用情况,并计算其使用率
  12. Codeforces 711B- Chris and Magic Square
  13. java数字时钟_Java实现动态数字时钟
  14. 大数据平台,Hadoop集群架构,概述及原理
  15. bmap、百度地图自定义画矩形
  16. matlab系统解列模块,基于MATLAB准同期装置建模与仿真-毕设论文.doc
  17. 怎么测量桌面圆角的半径_大半径小圆弧怎么测量才准确
  18. ijkPlayer的基本使用(一)
  19. 信息系统项目管理师学习笔记8—项目质量管理
  20. 【分布式数据网格】如何超越单片数据湖迁移到分布式数据网格

热门文章

  1. mvc中 html是否单选按钮,c# – 如何使用Html.EditorFor在MVC3中渲染单选按钮?
  2. 关于静电放电保护,这篇文章不可不看,太专业了!
  3. Prometheus监控Kafka集群
  4. 我的朋友圈又被刷屏了
  5. 设备管理系统的功能通常有哪些?
  6. Canfestival 导入EDS,生成文件没有数据名。
  7. 联想g510拆键盘的简单方法_联想Z500笔记本更换键盘图文简单教程
  8. php ajax传递变量,将PHP变量传递回jQuery $.ajax函数
  9. Head First Design pattern Observer
  10. docker实现redis主从架构