C语言——高精度减法
2023-12-16 14:57:01
相较于高精度加法,高精度减法会有一些不同,如果是num1 - num2的话,如果num1 >?num2时,也就是结果为正时,只需要对每一位进行按位相减,如果不够就向下一位借位;但是如果是num1 < num2时,即结果为负时,再按上方的算法就会得到错误的结果,我们可以转换一下,num1- num2 < 0,那么num2 - num1 > 0,而且num1 - num2 = - (num2 - num1),所以在结果为负时,我么可以将减数互换,是结果为正,然后再结果前面加一个负号。
代码实现:
#include <stdio.h>
#include <string.h>
void DigitReverse(char arr[])//反转字符串,以便后续计算
{
int length = (int)strlen(arr);
for (int i = 0; i < length / 2; i++)
{
int temp = arr[i];
arr[i] = arr[length - i - 1];
arr[length - i - 1] = temp;
}
}
void StringTranstoNumber(char arrchar[],int arrnum[])//将字符数组转换为数字数组
{
int length = (int)strlen(arrchar);
for (int i = 0; i < length; i++)
{
arrnum[i] = arrchar[i] - '0';
}
}
int JudgeResPorN(char arrch1[], char arrch2[],int len1,int len2)//1代表结果为负,0代表结果为正
{
if (len1 > len2)//数字一位数大,则结果为正
{
return 0;
}
else if(len1 == len2)//两数字位数相等,遍历数字的每一位
{
for (int i = 0; i < len1; i++)
{
if (arrch1[i] == arrch2[i])//i位上的数字相等,就继续判断后面的数位上的数字
{
continue;
}
else if(arrch1[i] > arrch2[i])//数字一的i位数字大于数字二的,则为正
{
return 0;
}
else//数字二的i位数字大于数字一的,则为正
{
return 1;
}
}
}
else//len1 < len2时结果为负
{
return 1;
}
}
void Calculate(int num1[], int num2[],int numsub[],int length)//计算减法部分
{
int borrow = 0;//borrow为借位,只能是0或-1
for (int i = 0;i < length; i++)
{
numsub[i] = num1[i] - num2[i] + borrow;//i位的结果是两数字i位相减然后加上i - 1位的借位,这里是加0或-1
if (numsub[i] < 0)//只要i位是负的,则要向i + 1位借位
{
borrow = -1;//借位
numsub[i] = numsub[i] + 10;//借位借一作十,这一位的最终结果是十加原来的负数
}
else//i位是正的,就不用借位
{
borrow = 0;
}
}
}
void Print(int numres[],int length)//打印部分
{
int i = length + 1;
while (i > 0 && numres[i] == 0)//去掉前导0
{
i--;
}
for (; i >= 0; i--)
{
printf("%d",numres[i]);
}
}
void BigNumSub(char arrch1[],char arrch2[],int arrsub[])
{
int len1 = (int)strlen(arrch1);
int len2 = (int)strlen(arrch2);
int length = len1 > len2 ? len1 : len2;
int c = JudgeResPorN(arrch1, arrch2, len1, len2);//在字符串反转之前就要判断结果的正负
DigitReverse(arrch1);
DigitReverse(arrch2);
int num1[505] = { 0 };
int num2[505] = { 0 };
StringTranstoNumber(arrch1,num1);
StringTranstoNumber(arrch2,num2);
if (c == 1)//结果为负
{
Calculate(num2,num1,arrsub,length);//结果为负就互换num1和num2,这样结果为正
printf("-");//结果转为正后在结果前面加一个负号
Print(arrsub,length);//打印结果
}
else//结果为正
{
Calculate(num1,num2,arrsub,length);//结果为正就正常计算
Print(arrsub, length);//打印结果
}
}
int main()
{
char ch1[505] = "0";
char ch2[505] = "0";
scanf("%s",ch1);
//ch1 - ch2
scanf("%s",ch2);
int res[505] = {0};
BigNumSub(ch1,ch2,res);
}
文章来源:https://blog.csdn.net/stewie6/article/details/135006217
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!