高精度减法

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

 

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

在这两点上,既然你会进位,就一定会借位,故单独说一下负数的问题:-(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;

 

posted @ 2019-03-10 14:10  Simex  阅读(263)  评论(0编辑  收藏  举报