大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位。

其方法是:

首先,要判断减数和被减数哪一个位数长,减数位数长是正常减;被减数位数长,则被减数减减数,最后还要加上负号;两数位数长度相等时,最好比较一下哪一个数字大,否则负号处理会很繁琐,用大的减去小的,最后加上负号;

其次,处理每一项时要,如果前一位相减有借位,就先减去上一位的借位,无则不减;再去判断是否能够减开被减数,如果减不开,就要借位后再去减,同时置借位为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)——大数减法相关推荐

  1. 大数运算(5)——大数除法(取模、取余)

    有关于大数除法的运算可以大致分为两种:一种是求商(取模),另一种是求余数(取余). 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>= ...

  2. 大数运算(8)——大数幂运算

    大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...

  3. 大数运算(7)——大数阶乘(求阶乘)

    对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大. 就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值.这时候,我们要通 ...

  4. 大数运算(2)——大数加法

    /*大数加法的中心思想就是:模拟人工列竖式算加法的方法.先从最低位开始相加,判断是否进1,一直到最高位. 例如: 求12545642233+278545的和,该怎么算? 是这样的:      3  3 ...

  5. 大数运算(1)——大数储存

    int (16位) -32768-32767 (注:现在大多数的编译器的int型是32位的 也就是说跟long型的大小一样) long long或__int64(64位)     -922337203 ...

  6. 大数运算(6)——大数阶乘(求位数)

    对于求一个大数的阶乘的位数一般有两种方法: 第一种: lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 =[lgN+lg(N-1)+lg(N-2)+......+lg ...

  7. c语言编程 大数运算,求大数运算C语言代码?

    #define MAX 400 void my_read(int *a) { int len,i,flag=0; char s[MAX]; aa: while(1) { scanf("%s& ...

  8. 大数运算(4)——大数乘法

    首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后 ...

  9. Java实现大数运算

    一.大数运算介绍 大数运算,顾名思义,就是很大的数值的数进行一系列的运算.它是指由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数 ...

最新文章

  1. mysql pma用户_MYSQL用户权限管理学习笔记
  2. android自定义离线地图,MapBox GL Android:已下载但未使用的自定义磁贴源的离线地图...
  3. LAMP编译安装,并搭建discuz
  4. 云炬Android开发笔记 使用新版本Android studio快速Build低版本项目的仓库代码(标红部分)
  5. 在Synaptic Package Manager 加载USB 接口的CD-ROM
  6. tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息
  7. ejb运行程序_在哪里可以运行EJB?
  8. 【HDU - 1520】Anniversary party (树形dp)
  9. bind1nd\bind2nd
  10. java如何实取随机数_java - 如何在Kotlin中获取随机数?
  11. html边框塌陷怎么,你不知道的CSS(边框塌陷)?
  12. sql 表变量 临时表_何时使用SQL临时表与表变量
  13. 计算机中那些事儿(五):我与Dos的不解情缘---应用篇
  14. 关于数组指针的一道面试题
  15. paip.软件开发之COOKIE调试
  16. mac 修改hosts 文件的方法
  17. 解密加油优惠打折券的制作过程
  18. Flutter bottomSheet的使用
  19. JAVASE高级部分
  20. 序列划分c语言,看懂了这些,你对缠论中的线段划分就基本掌握了!

热门文章

  1. openssl https 单向认证连接成功示例
  2. 数据库连接字符串.udl
  3. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...
  4. Eclipse插件:Eclipse Color Theme
  5. Python列表排序 reverse、sort、sorted 操作方法详解
  6. 详解Python中的下划线
  7. cuda core和sp
  8. 图解linux下top命令的使用
  9. 详解C++移动语义std::move()
  10. [云炬创业学笔记]第一章创业是什么测试4