大数运算(3)——大数减法
来源:互联网 发布:王俊煜 知乎 编辑:程序博客网 时间:2024/05/22 13:59
大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位。
其方法是:
首先,要判断减数和被减数哪一个位数长,减数位数长是正常减;被减数位数长,则被减数减减数,最后还要加上负号;两数位数长度相等时,最好比较一下哪一个数字大,否则负号处理会很繁琐,用大的减去小的,最后加上负号;
其次,处理每一项时要,如果前一位相减有借位,就先减去上一位的借位,无则不减;再去判断是否能够减开被减数,如果减不开,就要借位后再去减,同时置借位为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};//将数组元素全部初始化为0void 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--;elsebreak; }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; }
0 0
- 大数运算(3)——大数减法
- 大数运算——加法,减法,乘法
- 大数运算——加法,减法,乘法
- 大数运算——加法,减法,乘法 .
- 大数运算——加法减法
- 大数运算——加法减法
- 大数系列——大数减法
- 大数减法 (高精度运算)
- [算法题] 大数减法运算
- 大数减法
- 大数减法
- 大数减法
- 大数减法
- 大数减法
- 大数减法
- 大数减法
- 大数减法
- 大数减法
- PHP中使用memcache存储session的三种配置方法
- android 通信
- java版求字符串的最大公共子串
- 字符串处理总结之一(C#String类)
- CSU - 1111 三家人
- 大数运算(3)——大数减法
- 大数据量下高并发同步的讲解
- PuTTY + Xming
- mybatis笔记-基础
- 关于如何在java中实现中文首字母索引排序的问题
- Linux安装
- First Bad Version
- list ,set,map 三中类型的集合那些能存放null类型的值
- 操作系统原理Linux篇 读书笔记(2)——Linux进程管理