大一小白尝试C语言高精度减法
一、引言
笔者是一位大一学生,在做题的过程中接触到了高精度除法,而其中计算商的过程中需要用到高精度减法,因此写下这篇博客帮助理清思路。希望这篇博客能够帮助到更多刚接触C语言的同学们。如果文中有错误,欢迎指正。函数全部代码会在文章最后给出,不必分段复制。
二、什么是高精度减法
高精度减法就是对于用基本的数据类型无法表示的大整数进行减法运算
三、为什么需要高精度减法
在C语言中,常用的数据类型有int, long long, double等,但是这些数据类型的大小有限,当输入的数据过大,这些数据类型就无法实现其功能,强行使用可能会出现错误。在这种情况下,我们需要高精度减法来完成运算。
四、如何用C语言实现高精度减法
数据类型
与高精度加法相类似的,我们选择字符串来存储较大的一些整数。
准备工作
为了方便计算,我们在处理数据时,可以先比一次大小,然后永远用大的数减去小的数。这里引入一个比大小的函数。
int Size_Comparison(char str_1[], int length_1, char str_2[], int length_2) {
int i;
if (length_1 < length_2) {
return -1;
}
else if (length_1 > length_2) {
return 1;
}
else {
for (i = 0; i < length_1; i++) {
if (str_1[i] < str_2[i]) {
return -1;
}
else if (str_1[i] > str_2[i]) {
return 1;
}
}
return 0;
}
}
变量介绍
void High_Precision_Subtraction(char subtrahend[], int length_subtrahend, char subtractor[], int length_subtractor, char answer[], int size_answer, int* flag) {
//为了保证输入输出的格式统一,所以传入了answer这个指针,而不是直接在原字符串进行加减
int i;
int temp_ans[Number_Size];
int length_max;
int length_min;
int i_temp;
int size_result;
int last;
}
传入的参数有3个char*,1个int*,依次为被减数,减数,差,符号
初始化
memset(temp_ans, 0, sizeof(temp_ans));
if (length_subtrahend < length_subtractor) {
length_max = length_subtractor;
length_min = length_subtrahend;
}
else {
length_max = length_subtrahend;
length_min = length_subtractor;
}
//确定长度
作差
作差的过程在循环中完成了
size_result = Size_Comparison(subtrahend, length_subtrahend, subtractor, length_subtractor);//先比大小
if (size_result < 0) {
*flag = -1;
for (i = 0; i < length_min; i++) {//个位对齐开始作差
temp_ans[i] = subtractor[length_max - i - 1] - subtrahend[length_min - i - 1];
}
for (i = length_min; i < length_max; i++) {//把剩下的抄回来
temp_ans[i] = subtractor[length_max - i - 1] - '0';
}
}
else if (size_result > 0) {
*flag = 1;
for (i = 0; i < length_min; i++) {
temp_ans[i] = subtrahend[length_max - i - 1] - subtractor[length_min - i - 1];
}
for (i = length_min; i < length_max; i++) {
temp_ans[i] = subtrahend[length_max - i - 1] - '0';
}
}
else {
*flag = 0;
}
//完成相减,并确保是大数减小数
进位
for (i = 0; i < length_max; i++) {
if (temp_ans[i] < 0) {//当前位是个负数,就向高位借个1,1就足够了
temp_ans[i + 1] -= 1;
temp_ans[i] += 10;
}
}
//完成进位
结束
last = 0;
for (i = 0; i < length_max; i++) {//找到最高位
if (temp_ans[i]) {
last = i;
}
}
i = 0;
while (i < last - i) {//逆转回去
i_temp = temp_ans[i];
temp_ans[i] = temp_ans[last - i];
temp_ans[last - i] = i_temp;
i++;
}
memset(answer, 0, size_answer);
for (i = 0; i <= last; i++) {//输出到answer里面
answer[i] = temp_ans[i] + '0';
}
高精度减法函数
实现的实在是太繁琐了,之后会简化的。
void High_Precision_Subtraction(char subtrahend[], int length_subtrahend, char subtractor[], int length_subtractor, char answer[], int size_answer, int* flag) {
//为了保证输入输出的格式统一,所以传入了answer这个指针,而不是直接在原字符串进行加减
int i;
int temp_ans[Number_Size];
int length_max;
int length_min;
int i_temp;
int size_result;
int last;
memset(temp_ans, 0, sizeof(temp_ans));
if (length_subtrahend < length_subtractor) {
length_max = length_subtractor;
length_min = length_subtrahend;
}
else {
length_max = length_subtrahend;
length_min = length_subtractor;
}
//确定长度
size_result = Size_Comparison(subtrahend, length_subtrahend, subtractor, length_subtractor);//先比大小
if (size_result < 0) {
*flag = -1;
for (i = 0; i < length_min; i++) {//个位对齐开始作差
temp_ans[i] = subtractor[length_max - i - 1] - subtrahend[length_min - i - 1];
}
for (i = length_min; i < length_max; i++) {//把剩下的抄回来
temp_ans[i] = subtractor[length_max - i - 1] - '0';
}
}
else if (size_result > 0) {
*flag = 1;
for (i = 0; i < length_min; i++) {
temp_ans[i] = subtrahend[length_max - i - 1] - subtractor[length_min - i - 1];
}
for (i = length_min; i < length_max; i++) {
temp_ans[i] = subtrahend[length_max - i - 1] - '0';
}
}
else {
*flag = 0;
}
//完成相减,并确保是大数减小数
for (i = 0; i < length_max; i++) {
if (temp_ans[i] < 0) {//当前位是个负数,就向高位借个1,1就足够了
temp_ans[i + 1] -= 1;
temp_ans[i] += 10;
}
}
//完成进位
last = 0;
for (i = 0; i < length_max; i++) {//找到最高位
if (temp_ans[i]) {
last = i;
}
}
i = 0;
while (i < last - i) {//逆转回去
i_temp = temp_ans[i];
temp_ans[i] = temp_ans[last - i];
temp_ans[last - i] = i_temp;
i++;
}
memset(answer, 0, size_answer);
for (i = 0; i <= last; i++) {//输出到answer里面
answer[i] = temp_ans[i] + '0';
}
return;
}
五、结语
十分感谢各位的阅读!