高精度算法—减法篇

Posted luoyoooo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度算法—减法篇相关的知识,希望对你有一定的参考价值。

本文大部分思路,代码来源于 stone_juice石汁

本人加以改动符合自己的思维过程;

一.搞定高精度数的存储

当long long都解决不了数的存储时,用数组存储,且为了后续计算方便,读取高精度数时用string类型读取。

1 for (int i = 1; i <= s1.length(); i++)
2         arr1[i] = s1[i - 1] - 0;
3     for (int i = 1; i <= s2.length(); i++)
4         arr2[i + s1.length() - s2.length()] = s2[i - 1] - 0;//这里是为了解决长度大的数减去长度小的数 例如89999-9

 

二.如何计算

当arr1里面的每一位数都大于arr2里面的每一位数时

技术图片

 

当arr1里面的每一位数有小于arr2里面的位数时,即当前数加10,前面一个数减1

技术图片

 

 

1     for (int i = s1.length(); i > 0; i--)
2     {
3         if (arr1[i] < arr2[i])
4         {
5             arr1[i - 1]--;
6             arr1[i] += 10;
7         }
8         ans[i] = arr1[i] - arr2[i];
9     }

 

三.一些小bug

首先需要解决的几个坑点:

①前导零如何去除

比如 100001-100000=00001;

1 int tmp = 1;
2     while (ans[tmp] == 0)
3         tmp++;

②本身结果为零如何输出

比如 100000-100000=0;

1 if (s1.compare(s2) == 0)
2         return "0";

③小数减大数怎么办

比如 999-1000=-1;

1 if (s1.length() < s2.length() || (s1.length() == s2.length() && s1 < s2))
2     {
3         return "-" + jianfa(s2, s1);
4     }

 

四.多次计算怎么办

直接写成函数,在main函数里面调用即可;

终极代码(注意,此代码不能解决a,b两个数<0的情况)

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 int arr1[200000], arr2[200000], ans[200000];
 6 string jianfa(string s1, string s2)
 7 {
 8     string ss;
 9     if (s1.compare(s2) == 0)
10         return "0";
11     if (s1.length() < s2.length() || (s1.length() == s2.length() && s1 < s2))
12     {
13         return "-" + jianfa(s2, s1);
14     }
15     for (int i = 1; i <= s1.length(); i++)
16         arr1[i] = s1[i - 1] - 0;
17     for (int i = 1; i <= s2.length(); i++)
18         arr2[i + s1.length() - s2.length()] = s2[i - 1] - 0;//这里是为了解决长度大的数减去长度小的数 例如89999-9
19     for (int i = s1.length(); i > 0; i--)
20     {
21         if (arr1[i] < arr2[i])
22         {
23             arr1[i - 1]--;
24             arr1[i] += 10;
25         }
26         ans[i] = arr1[i] - arr2[i];
27     }
28     int tmp = 1;
29     while (ans[tmp] == 0)
30         tmp++;
31     for (int i = tmp; i <= max(s1.length(), s2.length()); i++)
32         ss += ans[i] + 0;
33     return ss;
34 }
35 int main()
36 {
37     string s1,s2;
38     cin >> s1 >> s2;
39     cout << jianfa(s1, s2);
40 }

 

以上是关于高精度算法—减法篇的主要内容,如果未能解决你的问题,请参考以下文章

高精度减法?!

高精度减法

高精度2--减法

高精度减法

高精度减法

高精度 加法 减法 乘法 除法 整合