社区讨论
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 条回复,欢迎继续交流。
正在加载回复...