转载来源:

http://blog.sina.com.cn/s/blog_72c80bcf0102xs1y.html

https://www.cnblogs.com/FZfangzheng/p/7700699.html


大数加法运算实现算法如下:(1)将A、B按位对齐;(2)低位开始逐位相加;(3)对结果做进位调整。

2.2大数减法

大数减法运算实现算法如下:(1)将A、B按位对齐;(2)低位开始逐位相减;(3)对结果做借位调整。

2.3大数乘法

大数乘法运算实现算法如下:(1)引入sum2、sum1中间过渡量;(2)在n的每一位上处理m;

(3)通过每一层循环,实现乘法的加法化;(4)对结果做进位调整。

2.4大数除法

大数除法运算实现算法如下:

(1)引入al来标识a的长度,bl来标识b的长度;(2)测算a和b的长度;

(3)高位开始,对位做减法,并完成借位;(4)高位开始逐位计算商;(5)整理商,产生余数。

2.5大数取模

在取模运算中用到了上面的除法运算,只需返回余数即可。

3.结论

大数运算实际上都是建立在位运算的基础上的,实际上就是对存储大数的数组里每一个数组项进行操作。将大数翻转过来存储是为了防止在计算过程中出现进位不好表示和溢出的问题。这种处理也可以看作是对字符串的处理,即把这个数组里的每一位数字转化成字符进行处理。同时如果涉及到小数,如果是加法运算,可以把小数点前后的数据分开处理;如果是乘法运算,可将其转换成整数运算之后,再转换成小数。


大数运算

1.为什么要有大数运算

我们都知道计算机能够储存的各种类型数的大小是有限的,比如int型在32位的情况下范围是从-2^31~2^31-1,那么如果我们要计算的数非常的大,我们该如何做呢?那样便需要运用到大数运算。

2.大数运算怎么实现

大数运算本质上来说是模仿人们进行笔算时的操作,将人们笔算时的操作通过代码来实现,从而达到实现大数运行的结果。

3.大数加法

c++代码如下:

#include <cstring>
#include <cstdio>
using namespace std;
const int Max =10001;
int main(){char a[Max],b[Max];//用来以字符串形式存放输入的数字int aa[Max],bb[Max];//以每位数字的形式存放输入的数字int sum[Max];//用来存放每位数字的和int lena,lenb;scanf("%s%s",a,b);lena = strlen(a);//记录数字长度lenb = strlen(b);//将字符转化为数字for(int i= 0 ; i < lena; i ++){aa[i] = a[i] - 48;}for(int i= 0 ; i < lenb; i ++){bb[i] = b[i] - 48;}int num = 0;//当一方数字每位都计算完后结束循环while(lena > 0 && lenb > 0){lena -- ;lenb -- ;sum[num ++ ] = aa[lena] + bb[lenb];}//位数较多的直接加到sum数组后面while(lena > 0){lena --;sum[num ++] = aa[lena] ;}while(lenb > 0){lenb -- ;sum[num ++ ] = bb[lenb];}//进位操作,sum[i]>10则进位for(int i = 0 ; i < num ; i ++ ){if(sum[i] >= 10){sum[i+1] += 1;sum[i] -= 10;}}//判断最高位是否进位if(sum[num] != 0){num ++ ;}for(int i = num -1 ; i >= 0 ; i -- ){printf("%d",sum[i]);}printf("\n");return 0;
}

4.大数减法

C++代码如下:

#include <cstring>
#include <cstdio>
using namespace std;
const int Max = 10001;
char a[Max], b[Max];
int aa[Max], bb[Max];
int sum[Max];
int lena, lenb;
int flag = 0;
//若aa>bb的值则返回true
bool cmp() {//记录变化bool f = false;if (lena > lenb) {return true;}else if (lena == lenb){for (int i = 0; i < lena; i++) {if (aa[i] > bb[i])f = true;if (aa[i] < bb[i] && f != true)return false;}return true;}return false;
}
int main() {scanf("%s%s", a, b);lena = strlen(a);lenb = strlen(b);for (int i = 0; i < lena; i++) {aa[i] = a[i] - 48;}for (int i = 0; i < lenb; i++) {bb[i] = b[i] - 48;}int num = 0;//判断哪个数更大if (cmp()) {while (lena > 0 && lenb > 0) {lena--;lenb--;sum[num++] = aa[lena] - bb[lenb];}while (lena > 0) {lena--;sum[num++] = aa[lena];}}else {flag = 1;while (lena > 0 && lenb > 0) {lena--;lenb--;sum[num++] = bb[lenb] - aa[lena];}while (lenb > 0) {lenb--;sum[num++] = bb[lenb];}}//若相减小于零,则向前借位for (int i = 0; i < num; i++) {if (sum[i] < 0) {sum[i + 1] -= 1;sum[i] += 10;}}//添加正负号if (flag) {for (int i = num - 1; i >= 0; i--) {if (sum[i] != 0) {sum[i] = -sum[i];break;}}}bool zero = false;for (int i = num - 1; i >= 0; i--) {if (sum[i] != 0)zero = true;if(zero == true)printf("%d", sum[i]);}if (zero == false) {printf("0");}printf("\n");return 0;
}

5.大数乘法

C++代码如下:

#include <cstring>
#include <cstdio>
using namespace std;
const int Max = 10001;
int main(){char a[Max],b[Max];int aa[Max],bb[Max];int sum[Max*2];scanf("%s%s",a,b);int lena = strlen(a);int lenb = strlen(b);for (int i = 0 ; i < lena; i ++ ){aa[i] = a[i] - 48;}for (int i = 0 ; i < lenb; i ++ ){bb[i] = b[i] - 48;}memset(sum,0,sizeof(sum));int num;for(int j = lenb - 1 ; j >= 0 ; j --){//模仿乘法,第一次放在最低位,第二次放在前一位,依次类推num = lenb - 1 - j;for(int i = lena - 1 ; i >= 0 ; i -- ){sum[num ++ ] += bb[j] * aa[i];}}for (int i = 0 ; i < num ; i ++ ){//若最高位大于10,则循环位数加一,直至最高位不大于10if(sum[num - 1] >= 10){num ++ ;}sum[i + 1] += sum[i] /10 ;sum[i] = sum[i] % 10;}for (int i = num- 1 ; i >= 0 ; i-- ){printf("%d",sum[i]);}printf("\n");return 0;
}

6.大数除法

C++代码如下:

#include <cstdio>
#include <cstring>
using namespace std;
const int Max = 10001;
int Sub(int * aa , int * bb , int lena , int lenb){//判断是否是被除数更大,是则返回-1if (lena < lenb){return -1;}else if(lena == lenb){for(int i = lena -1 ; i >=0 ; i--){if (aa[i] > bb[i])  break;else if(aa[i] < bb[i]) return -1;}}for(int i = 0; i < lena ; i ++){aa[i] -= bb[i];if(aa[i] < 0){aa[i+1] -= 1;aa[i] += 10;}}for (int i = lena -1 ; i >= 0 ; i--){if (aa[i]) return (i+1);}return 0;
}
int main(){char a[Max],b[Max];int aa[Max],bb[Max];int sum[Max];//记录最长长度,因为除法不可能比被除数大(考虑的是整数除法)int maxlen;scanf("%s%s",a,b);int lena = strlen(a);int lenb = strlen(b);memset(aa,0,sizeof(aa));memset(bb,0,sizeof(bb));memset(sum,0,sizeof(sum));//注意逆序for(int i = lena - 1 , j = 0 ; i >= 0 ; i --  ,j ++){aa[j] = a[i] - 48 ;}for(int i = lenb - 1 , j = 0 ; i >= 0 ; i --  ,j ++){bb[j] = b[i] - 48 ;}//被除数小于除数,为0if(lena < lenb){printf("0\n");return 0;}maxlen = lena;int n = lena - lenb;//用于将bb数组里对应最高位的数移至aa数组最高位位置for(int i = lena - 1 ; i >= 0 ; i --){if(i >= n){bb[i] = bb[i-n];}else{bb[i] = 0;}}lenb = lena;int t;for (int i = 0 ; i <= n ; i ++ ){//循环执行减法while((t = Sub(aa,bb+i,lena,lenb-i)) >= 0){lena = t;sum[n - i] ++;}}int i;for( i = maxlen -1 ;i >= 0 ;i--){if(sum[i]) break;}if(i >= 0){for(;i>=0;i--){printf("%d",sum[i]);}}else{printf("0");}printf("\n");return 0;
}

大数运算(加减乘除)相关推荐

  1. Java的学习与java大数运算

    之前就学过一点java,但太久没用知识点早就还给书本,之前在实验室搞到一本java的书,今天来重新温习一下 java的语法大部分和c++语言是一样的,入门非常快,所以在这里基础语句的用法就省略了 输出 ...

  2. RSA与大数运算(C语言)

    ========================================================================== 前言:此文来自于www.pediy.com一位Cr ...

  3. 怎么用c语言进行大数运算

    在C语言中进行大数运算,一般有以下几种方式: 自己实现高精度计算库:通过定义自己的数据结构(比如用数组表示大整数)和实现基本的大数加减乘除等运算,可以实现高精度计算.但是这需要自己实现大量的代码,而且 ...

  4. QT计算器 之 大数运算

    1.简介: 计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现,今天我想讲的是基于C++语言,由QT实现的可以计算大数的简单计算器. 2.作品演示: (1)简单四则运算 (2)大数运算 3 ...

  5. RSA与大数运算(转载)

    RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位的 大数运算之上,所以我们在现阶段首先需要掌握1024位的大数 运算原理. 大多数的编译器只能支持到64位的整数运算,即我们在运算中 ...

  6. 《RSA与大数运算》

    标 题:<RSA与大数运算> 发信人:afanty 时 间:2003/04/28 04:50pm 详细信息: 基于以下原因,俺估计RSA算法会被越来越多的共享软件采用: 1.原理简洁易懂 ...

  7. 转贴:RSA与大数运算

    看到一篇好文章,但是没有用过.:P 来自:http://it.haoxz.com/t/html/e379101282172_1.htm 作者:afanty@vip.sina.com 基于以下原因,俺估 ...

  8. C语言实现大数运算(长整数的加、减、乘、除)

    由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 .大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算. 简单表 ...

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

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  10. java中大数开方_Java中的大数运算

    # 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...

最新文章

  1. Facebook-Rebound探索发现
  2. 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
  3. 【51单片机快速入门指南】4.5:I2C 与 TCA6416实现双向 IO 扩展
  4. 在shell脚本中使用*正则的问题
  5. free store VS heap(自由存储区VS堆)
  6. 白噪音和粉红噪音煲机_10小时煲机后,HIFIMAN TWS600给你不一样的听觉盛宴
  7. koa2 mysql增删改查_使用nodejs-koa2-mysql-sequelize-jwt实现登录注册,文章增删改查接口...
  8. Win10 LTSB 2016 激活
  9. 怎么把计算机上打印任务解除,如何终止打印机任务_如何停止打印机任务-win7之家...
  10. 2020江苏事业编计算机类真题,2020江苏事业单位计算机类岗位考情
  11. 从零开始设计一个右键菜单组件
  12. byref和byval什么时候该使用什么时候不该使用
  13. 关于利用计算机,关于计算机应用基础试题
  14. 基于御安全APK加固的游戏反外挂方案
  15. Mysql中的升序和降序以及一个字段升序和一个字段降序
  16. 用C语言实现一个cat命令
  17. 作为家庭娱乐衡量微型计算机基本技术指标,大学计算机 习题一..ppt
  18. Eclipse使用Maven创建Web时错误:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webap
  19. [Linux Kernel] memory-barriers 内存屏蔽 官方文档
  20. linux 原始套接字 绑定网卡,Linux网络数据捕获之原始套接字

热门文章

  1. 数字人轻松学习Blender系列之八:建模-2
  2. js如何实现数组随机排序【附洗牌算法心得】
  3. 《遥感原理与应用》总结—遥感平台
  4. 计算机专业考研 数学分析,(NEW)中山大学数据科学与计算机学院数学分析(A)历年考研真题汇编.pdf...
  5. 网络协议学习---LLDP协议学习
  6. 验证注册页面信息(JavaScript)
  7. 十折交叉验证和混淆矩阵
  8. 《Deep Learning for Visual Tracking: A Comprehensive Survey》
  9. 华为android最新版本下载地址,华为Android手机驱动
  10. ROS2机器人笔记20-08-15