大数运算(3)——大数减法
大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位。
其方法是:
首先,要判断减数和被减数哪一个位数长,减数位数长是正常减;被减数位数长,则被减数减减数,最后还要加上负号;两数位数长度相等时,最好比较一下哪一个数字大,否则负号处理会很繁琐,用大的减去小的,最后加上负号;
其次,处理每一项时要,如果前一位相减有借位,就先减去上一位的借位,无则不减;再去判断是否能够减开被减数,如果减不开,就要借位后再去减,同时置借位为1,否则置借位为0。
结果可能会出现前面是一堆0的情况,要处理好,如当减数为112,而被减数为111时,会出现001 ,这时,需要将前面的0删除。
例如:13154-21213(同样,从最低位开始相减)
3 2 1 2 2
- 4 5 1 3 1
————————
9 //向前一位借1,则前一位的2变为1
6 // 2---->1向前一位借1,则前一位的1变为0
9 //1---->0向前一位借1,则前一位的2变为1
8 //2---->1向前一位借1,则前一位的2变为1
0 //不用借位。
9 6 9 8 0 //当然,输出时将0删除,并加上负号,即-9896
下面是C语言代码实现:
#include<stdio.h>
#include<string.h>
int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0
void sub(int x[],int y[],int len)
{ int i,j; for(i=0;i<len;i++) { if(x[i]>=y[i])//如果x[i]>=y[i],不用向前一位借1,可直接减 z[i]=x[i]-y[i]; else //如果x[i]<y[i],向前一位借1,同时前一位应减1 { z[i]=x[i]+10-y[i]; x[i+1]=x[i+1]-1; } } for(i=len-1;i>0;i--)//删除前缀0 { if(z[i]==0) len--; else break; } for(i=len-1;i>=0;i--) //倒序输出数组 printf("%d",z[i]); printf("\n");
}
int main()
{ char a[100],b[100];//通过字符串对大数进行输入并储存 int len1,len2; while(scanf("%s %s",a,b)) { int i,j=0,k=0; len1=strlen(a); len2=strlen(b); for(i=len1-1,j=0;i>=0;i--)//将两个字符串中的字符转化为数字,并倒序储存到数组中,即字符串为123456,则数组为654321 x[j++]=a[i]-'0'; for(i=len2-1,k=0;i>=0;i--) y[k++]=b[i]-'0'; if(len1>len2) //若减数长度 > 被减数,正常减 sub(x,y,len1); else if(len1<len2) //若减数长度 < 被减数,被减数 减 减数 { printf("-"); sub(y,x,len2); } else //若减数长度 == 被减数,判断两个数的大小 { for(i=len1-1;i>=0;i--)//判断每一位两个数的大小 { if(x[i]==y[i]) continue; if(x[i]>y[i])//即减数大 { sub(x,y,len1); break; } if(x[i]<y[i])//即被减数大 { printf("-"); sub(y,x,len1); break; } } } } return 0;
}
大数运算(3)——大数减法相关推荐
- 大数运算(5)——大数除法(取模、取余)
有关于大数除法的运算可以大致分为两种:一种是求商(取模),另一种是求余数(取余). 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>= ...
- 大数运算(8)——大数幂运算
大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...
- 大数运算(7)——大数阶乘(求阶乘)
对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大. 就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值.这时候,我们要通 ...
- 大数运算(2)——大数加法
/*大数加法的中心思想就是:模拟人工列竖式算加法的方法.先从最低位开始相加,判断是否进1,一直到最高位. 例如: 求12545642233+278545的和,该怎么算? 是这样的: 3 3 ...
- 大数运算(1)——大数储存
int (16位) -32768-32767 (注:现在大多数的编译器的int型是32位的 也就是说跟long型的大小一样) long long或__int64(64位) -922337203 ...
- 大数运算(6)——大数阶乘(求位数)
对于求一个大数的阶乘的位数一般有两种方法: 第一种: lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 =[lgN+lg(N-1)+lg(N-2)+......+lg ...
- c语言编程 大数运算,求大数运算C语言代码?
#define MAX 400 void my_read(int *a) { int len,i,flag=0; char s[MAX]; aa: while(1) { scanf("%s& ...
- 大数运算(4)——大数乘法
首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后 ...
- Java实现大数运算
一.大数运算介绍 大数运算,顾名思义,就是很大的数值的数进行一系列的运算.它是指由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数 ...
最新文章
- mysql pma用户_MYSQL用户权限管理学习笔记
- android自定义离线地图,MapBox GL Android:已下载但未使用的自定义磁贴源的离线地图...
- LAMP编译安装,并搭建discuz
- 云炬Android开发笔记 使用新版本Android studio快速Build低版本项目的仓库代码(标红部分)
- 在Synaptic Package Manager 加载USB 接口的CD-ROM
- tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息
- ejb运行程序_在哪里可以运行EJB?
- 【HDU - 1520】Anniversary party (树形dp)
- bind1nd\bind2nd
- java如何实取随机数_java - 如何在Kotlin中获取随机数?
- html边框塌陷怎么,你不知道的CSS(边框塌陷)?
- sql 表变量 临时表_何时使用SQL临时表与表变量
- 计算机中那些事儿(五):我与Dos的不解情缘---应用篇
- 关于数组指针的一道面试题
- paip.软件开发之COOKIE调试
- mac 修改hosts 文件的方法
- 解密加油优惠打折券的制作过程
- Flutter bottomSheet的使用
- JAVASE高级部分
- 序列划分c语言,看懂了这些,你对缠论中的线段划分就基本掌握了!
热门文章
- openssl https 单向认证连接成功示例
- 数据库连接字符串.udl
- [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...
- Eclipse插件:Eclipse Color Theme
- Python列表排序 reverse、sort、sorted 操作方法详解
- 详解Python中的下划线
- cuda core和sp
- 图解linux下top命令的使用
- 详解C++移动语义std::move()
- [云炬创业学笔记]第一章创业是什么测试4