其实思路很简单,就是从后往前进行扫描然后逐项相减即可。比较麻烦的是进行借位和小数减大数,思路如下:
1.获取输入的两个数据的长度。这个可以在进行输入的时候就进行获取。
2.用长一些的数据减去短一些的数据。如果第一个数据长直接操作即可,若第二个数据长,则输出的时候加负号即可
3.借位。借位的数字加10,同时前面一个数字减一 。操作利用递归进行完成,注意数组不要越界,控制被借位的数字位置大于等于0.
4.长度相同,小数减大数。此时必定会出现再向前借位,即1会借位成为11,11会借位成为111(理解:例如11-22,11>22则第一个11中的第一个1一定会向前再借1,成为11再减2。也即11-22会变成111-22)。这个时候其实原始数据增加了10的n次方,也即得到的结果多了一部分,需要将这一块减去。但是直接减又会出现小数减大数,因此利用相反数,用多出来的10的n次方减去最初的结果再加负号即可。
具体实现代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX_LENGTH 20//初始定义最大数字长度为20
typedef struct{
char *numbers;
int length;
int max_length;
}Nums,*NNums;
//代码思路为:先调用输入函数进行输入,再调用相减函数,在相减函数中调用计算函数,计算函数中调用借位函数。尽可能降低耦合性。
Nums input();//输入函数,输入需要进行计算的数据
void sub(NNums,NNums,int*);//相减函数:第一个参数为长的数字&#x