一、熟悉的开场白
上回书说到高精度加法这个奇怪的东西。高精度加法的本质是什么?模拟竖式计算。所以,我们能够总结出:高精度运算的本质就是模拟竖式。
抱着这样的结论,我们来处理一下减法吧!
二、算法分析
类似于加法,我们也可以使用竖式来计算减法,这里上文也有所提及。在做减法的时候,需要注意的就是被减数必须比减数大,并且还要处理进位的问题。
三、步履踉跄的写代码
1.准备工作
首先,我们要创建一个文件 将输入的被减数和减数保存。样例代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char a[1024],b[1024];
gets(a);
gets(b);
return 0;
}
在将数字保存到char类型的数组之中后,我们就该把它们转换进int类型的数组里了。注意,这里每个int类型的下标内都只存一个个位数,也就是我们的每一位元素。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
char a[1024],b[1024];
int a_int[1024],b_int[1024];
gets(a);
gets(b);
return 0;
}
接着,我们应该考虑到一个问题:符号。如果被减数比减数小,那么我们就要手动添加一个负号,并且交换减数和被减数才可以。这是一点值得注意的。
那么,如何判断被减数和减数的大小情况?首先,我们能肯定,我们是要对char类型的变量做判断,而并非int类型的数组。
判断的条件是什么?第一,如果被减数的长度小于减数的长度,那么肯定就是被减数小于减数的。写成代码,如下:
strlen(a) < strlen(b)
第二,就是要判断如果被减数和减数的长度相等的情况了。我们只需要用到strcmp函数来判断一下即可了。我们如果把这一点写成代码的话如下:
strlen(a) == strlen(b) && strcmp(a,b) < 0
我们将之前的所有代码一整合,我们能够得到了判断正负性的代码了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char a[1024],b[1024];
int a_int[1024],b_int[1024];
gets(a);
gets(b);
if(strlen(a)<strlen(b) || (strlen(a)==strlen(b) && strcmp(a,b)<0))
{
cout<<"-";
char c[1024];
strcpy(c,a);
strcpy(a,b);
strcpy(b,c);
}
return 0;
}
这里又出现了一个新的函数:strcpy。这个函数的作用其实看代码就可以大致猜出来,就是将后一个参数里的值传给前一个参数。所以我们说c这个数组只不过是个工具人罢了。
接下来,就是一个简单易懂的部分了:将char类型的数组传给int类型。随着这一步的结束,准备工作也算是告一段落了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char a[1024],b[1024];
int a_int[1024],b_int[1024];
gets(a);