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

    高精度除法我是死活写不出来了

    前言:高精度的基本思路就是模拟竖式大家都知道吧(求助电话:高精度计算),想必你看到这,应该明白了加法和乘法了,那么,减法有什么区别呢,主要是需要判断结果是否为负以及借位;

    在这两点上,既然你会进位,就一定会借位,故单独说一下负数的问题:-(b-a)=-b+a=a-b

    你明白了吗?

    题目:洛谷P2142

     代码:

      

     1 /*
     2 万恶的高精度之减法
     3 这个基本思路和加法一样,字符读取,倒叙存储等
     4 但是注意,对于减法,还要考虑结果为负的情况 
     5 */
     6 #include<iostream>
     7 #include<cstdio>
     8 #include<cstring>
     9 using namespace std;
    10 int main(){
    11      char a[10050],b[10500];
    12      bool fu=0;//判断结果是否为负 
    13      scanf("%s%s",a,b);
    14           int s1=strlen(b);
    15                int s=strlen(a);
    16      int a1[100000],b1[100000],c[100000];
    17      {//判断结果是否为负 
    18          if(strlen(b)>strlen(a))
    19          {
    20              fu=1;//都比第一个长了还不必第一个大? 
    21          }
    22          else
    23          if(s1==s)
    24          {
    25              int k=1;//苦逼的一位一位判断 
    26              while(k<=s){
    27                  if(a[k]<b[k])
    28                  {
    29                      fu=1;
    30                      break;
    31                  }
    32                  k++;
    33              }
    34          }
    35      }
    36     if(fu)
    37      {
    38          char d[10000];
    39          strcpy(d,a);
    40          strcpy(a,b);
    41          strcpy(b,d);
    42          cout<<"-";
    43          //交换值,输出负号 
    44      }
    45                 s1=strlen(b);
    46                 s=strlen(a);
    47      for(int i=1;i<=s;++i)
    48      {
    49          a1[i]=int(a[s-i]-'0');
    50      }
    51 
    52      for(int i=1;i<=s1;++i)
    53      {
    54          b1[i]=int(b[s1-i]-'0');
    55      }//倒叙存储 
    56      s=max(s,s1);//事实上没必要 ,我们已经保证了s/a 最长 
    57      for(int i=1;i<=s1;++i)
    58      {
    59          if(a1[i]<b1[i])
    60          {
    61              a1[i+1]--;//借位处理 
    62              a1[i]+=10;
    63          }
    64          c[i]=a1[i]-b1[i];
    65      }
    66      s1++;
    67      while(c[s1]==0) s1--;//去前导零 
    68      if(s1<=0)
    69      cout<<0;//特判,如果两数相等,事实上也可以写在前面 
    70      for(int i=s1;i>=1;--i)
    71      cout<<c[i];
    72      //倒序输出 
    73      return 074 } 

    记得点个赞,谢谢了;

    特别是你也喜欢MIKU||二次元的话)

    THAT'S ALL;

  • 相关阅读:
    LeetCode 1032. Stream of Characters
    LeetCode 872. Leaf-Similar Trees
    LeetCode 715. Range Module
    LeetCode 353. Design Snake Game
    LeetCode 509. Fibonacci Number
    LeetCode 632. Smallest Range Covering Elements from K Lists
    LeetCode 963. Minimum Area Rectangle II
    LeetCode 939. Minimum Area Rectangle
    LeetCode 727. Minimum Window Subsequence
    LeetCode 844. Backspace String Compare
  • 原文地址:https://www.cnblogs.com/For-Miku/p/10505192.html
Copyright © 2011-2022 走看看