社区讨论

90pts求助

P2142高精度减法参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m3bgo21v
此快照首次捕获于
2024/11/10 18:38
去年
此快照最后确认于
2025/11/04 14:57
4 个月前
查看原帖
CPP
//功能:正整数-正整数 
//大整数存储:	0下标存储位数,1下标存储个位数,最高位下标+1处存储符号位 
//		实现:	以字符串方式输入大整数,转换字符数组为数字数组,逆置数字数组

#include<bits/stdc++.h>
using namespace std;

int x[165000001],y[165000001],z[165000001];
char c[165000001];

//输入大整数 
void input(int a[])
{
	
	cin>>c;				//输入大整数到字符数组
	int len=strlen(c);	//求位数
	
	//处理负数 
	if(c[0]=='-')
	{	
		for(int i=1;i<len;i++)		//负整数转换并逆置
			a[len-i]=c[i]-'0';
		a[len]=-1; 
		len--;
	}
	else 	//处理正数 
		for(int i=0;i<len;i++)		//正整数转换并逆置
			a[len-i]=c[i]-'0';
	
	a[0]=len;		//保存大整数位数 
	
	//消除前导零
	for(int i=a[0]; i>0&&a[i]==0; a[0]--,i--);
	a[a[0]+1]=a[len+1]; 		//后撤符号位 
}

//输出大整数 
void output(int a[])
{
	if(a[a[0]+1]==-1)
		cout<<"-"; 
	for(int i=a[0];i>=1;i--)
		cout<<a[i];	
	cout<<endl;
}

//小于(成立为真,否则为假) 
bool less_than(int a[],int b[])
{
	//不等长
	if(a[0]!=b[0])
		return a[0]<b[0];
	
	//等长
	for(int i=a[0];i>=1;i--)
		if(a[i]!=b[i]) 
			return a[i]<b[i];	
	
	//相等
	return false;
}

//竖式减_比大小:c=a-b
void sub1(int c[],int a[],int b[]) 
{
	c[0]=a[0]>b[0]?a[0]:b[0];
	
	bool LE=less_than(a,b);
	if(!LE)					//a>=b,差为正
		for(int i=1;i<=c[0];i++)
		{
			if(a[i]<b[i])	//借位
			{
				a[i+1]--;
				a[i]+=10;
			}
			c[i]=a[i]-b[i];
		}
	else					//a<b,差为负
		for(int i=1;i<=c[0];i++)
		{
			if(b[i]<a[i])	//借位
			{
				b[i+1]--;
				b[i]+=10;
			}
			c[i]=b[i]-a[i];
		}
	
	//判断差的位数
	while(c[c[0]]==0)
		c[0]--;		
	if(c[0]==0)
		c[0]=1;
	if(LE)
		c[c[0]+1]=-1;
} 

//竖式减_不比大小:c=a-b
void sub2(int c[],int a[],int b[]) 
{
	c[0]=a[0]>b[0]?a[0]:b[0];
	
	//对应项相减 
	for(int i=1;i<=c[0];i++)
		c[i]=a[i]-b[i];
		
	//判断正负:非零最高位为负则为负
	int len=c[0];
	while(c[len]==0)		//消去前导零 
		len--;
	if(len==0)
		len=1;
	
	if(c[len]<0)			//处理差为负的情况,所有位置乘负一 
	{
		c[len+1]=-1;
		for(int i=len;i>=1;i--)
			c[i]*=-1;
	}
	for(int i=1;i<=len;i++)			//若对应位为负,则按借位处理 
		if(c[i]<0)
		{
			c[i]+=10;
			c[i+1]-=1;
		}
	
	int sign=len+1;					//记忆符号位置 
	while(c[len]==0)		//消去前导零 
		len--;
	if(len==0)
		len=1;
	else
		c[len+1]=c[sign];		//后撤符号位,否则形如5-12会出错 
	c[0]=len;
} 

int main()
{
	//freopen("bignumber.in","r",stdin);
	//freopen("bignumber.out","w",stdin);
	
	//输入大整数 
	input(x);
	input(y);
	
	//x-y	
	sub1(z,x,y);	
	output(z);		//输出
	
	//x-y	
	//sub2(z,x,y);
	//output(z);		//输出 
		
}
 

回复

0 条回复,欢迎继续交流。

正在加载回复...