zoukankan      html  css  js  c++  java
  • 高精度减法

    高精度减法主要考虑这两件事:1.差为负数的情况。2.借位问题。

    首先我们考虑一下第一个问题1.怎么解决差为负数

    因为高精度就是列竖式模拟,而列竖式是小学学的,我记得那时候还没学负数吧,所以我们就默认用大数减小数,只要在前面输出一个符号就行。

    那我们再想一想如何判断两个数大小。首先若位数不等,那位数大的一定就是大数。重点是两数位数相等的情况,就从最高位比较,若这一位 a 大,那么 a 就比 b 大,跳出循环;若这一位 b 大,那么 b 就比 a 大,跳出。也就是说,只有 a 和 b 该位相等的时候,才继续比较。

    2.借位问题

    其实这个非常简单,只要先判断该位是 a 大还是 b 大,若 b 大,a 的下一位就减1,该位加10,然后在正常减。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 using namespace std;
     6 const int maxn = 1e3 + 5;
     7 char a1[maxn], b1[maxn];
     8 int a[maxn], b[maxn];        //a 是被减数,b 是减数 
     9 bool flag = true;
    10 int main()
    11 {
    12     gets(a1); gets(b1);                //读入,所有高精都这么读 
    13     int la = strlen(a1), lb = strlen(b1);
    14     if(la < lb) flag = false;        //判断两数大小,默认大数减小数 
    15     if(la == lb)
    16     {
    17         for(int i = 0; i < la; ++i)
    18         {
    19             if(a1[i] > b1[i]) {flag = true; break;}
    20             if(a1[i] < b1[i]) {flag = false; break;}
    21         }
    22     }
    23     if(flag == false) {swap(a1, b1); swap(la, lb);}        //若 a < b 就交换 a 和 b,别忘swap(la, lb) 
    24     for(int i  = 0; i < la; ++i) a[i] = a1[la - i - 1] - '0';
    25     for(int i  = 0; i < lb; ++i) b[i] = b1[lb - i - 1] - '0';
    26     for(int i = 0; i < la; ++i)
    27     {
    28         if(a[i] < b[i])     //借位 
    29         {
    30             a[i + 1]--; a[i] += 10;
    31         }
    32         a[i] -= b[i];
    33     }
    34     while(a[la] == 0 && la > 0) la--;  //删除前导0
    35     if(!flag) printf("-");    //负数先输出负号 
    36     for(int i = la; i >= 0; --i) printf("%d", a[i]);
    37     printf("
    ");
    38     return 0;
    39 }

    高精减不用像高精加考虑最高位的问题,因为差的位数一定小于等于 a 的位数,而且最高位一定不会再进位了(默认是大数减小数嘛)。

  • 相关阅读:
    微信小程序 组件事件传递
    vue 项目引入字体报错
    vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法
    react 动态获取数据
    百度地图marker点击任意一个当前的变化,其余的marker不变
    对象字面量中可以使用中括号作为属性,表示属性也能是一个变量
    二维数组转化为一维数组 contact 与apply 的结合
    一个对象如何复制给另一个对象,互不影响
    在-for 循环里面如何利用ref 操作dom
    mac 进程管理
  • 原文地址:https://www.cnblogs.com/mrclr/p/8524872.html
Copyright © 2011-2022 走看看