高精度减法
本文最后更新于 464 天前,其中的信息可能已经有所发展或是发生改变。
#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[100010] = { 0 };
	int num2[100010] = { 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[100010] = "0";
	char ch2[100010] = "0";
 
	scanf("%s",ch1);
 
	//ch1 - ch2
 
	scanf("%s",ch2);
 
	int res[100010] = {0};
 
	BigNumSub(ch1,ch2,res);
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇