C/C++之数据结构与算法2:高精度计算-减法

一、熟悉的开场白

上回书说到高精度加法这个奇怪的东西。高精度加法的本质是什么?模拟竖式计算。所以,我们能够总结出:高精度运算的本质就是模拟竖式。
抱着这样的结论,我们来处理一下减法吧!

二、算法分析

类似于加法,我们也可以使用竖式来计算减法,这里上文也有所提及。在做减法的时候,需要注意的就是被减数必须比减数大,并且还要处理进位的问题。

三、步履踉跄的写代码
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);
	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值