求调,好像是减法有问题
查看原帖
求调,好像是减法有问题
1284088
meifan666楼主2024/8/26 09:45
#include<bits/stdc++.h>
using namespace std;
struct bigint{
	int len;
	short num[100100];
};
string sa,sb;
bigint a,b,tot;
void print(bigint x){
	for(int i=x.len;i>0;i--){
		cout<<x.num[i];
	}
	cout<<'\n';
	return;
}
bool over(bigint x,bigint y){//x大于y
	cout<<1123456789<<'\n';
	if(x.len>y.len)return 1;
	if(x.len<y.len)return 0;
	for(int i=x.len;i>=1;i--){
		if(x.num[i]>y.num[i])return 1;
		if(x.num[i]<y.num[i])return 0;
	}
	return 0;
}
bigint add(bigint x,bigint y){
	bigint ans;
	memset(ans.num,0,sizeof(ans.num));
	ans.len=max(x.len,y.len);
	for(int i=1;i<=ans.len;i++){
		ans.num[i]+=x.num[i]+y.num[i];
		if(ans.num[i]>=10){
			ans.num[i+1]+=ans.num[i]/10;
			ans.num[i]%=10;
		}
	}
	if(ans.num[ans.len+1])ans.len++;
	return ans;
}
bigint cross(bigint x,bigint y){
	bigint ans;
	memset(ans.num,0,sizeof(ans.num));
	ans.len=x.len+y.len-1;
	for(int i=1;i<=x.len;i++){
		for(int j=1;j<=y.len;j++){
			ans.num[i+j-1]+=x.num[i]*y.num[j];
			if(ans.num[i+j-1]>=10){
				ans.num[i+j]+=ans.num[i+j-1]/10;
				ans.num[i+j-1]%=10;
			}
		}
	}
	if(ans.num[x.len+y.len])ans.len++;
	return ans;
}
bigint sub(bigint x,bigint y){
	bigint ans,xx=x,yy=y;
	memset(ans.num,0,sizeof(ans.num));
	if(over(yy,xx)){
		cout<<"-";
		swap(xx,yy);
	}
	for(int i=1;i<=x.len;i++){
		ans.num[i]=xx.num[i]-yy.num[i];
	}
	for(int i=1;i<=x.len;i++){
		if(ans.num[i]<0){
			ans.num[i]+=10;
			ans.num[i+1]-=1;
		}
	}
	ans.len=xx.len;
	while(ans.num[ans.len]==0&&ans.len>1)ans.len--;
	return ans;
}
bigint half(bigint x){
	bigint ans=x;
	ans.len=x.len;
	if(x.num[x.len]<2)ans.len--;
	for(int i=x.len;i>1;i--){
		ans.num[i-1]+=ans.num[i]%2*10;
		ans.num[i]/=2;
	}
	ans.num[1]/=2;
	return ans;
}
bigint mod(bigint x,bigint y){
	cout<<11111;
	bigint l,r=x,t,ans;
	l.len=1;l.num[1]=0;
	t.len=1;t.num[1]=1;
	while(over(r,l)){//while(l<=r)
		bigint mid=half(add(l,r));
		if(!over(cross(mid,y),x)){
			ans=mid;
			l=add(mid,t);
		}else{
			r=sub(mid,t);
		}
	}
	return ans;
}
int main(){
	cin>>sa>>sb;
	a.len=sa.size();
	for(int i=a.len-1,j=1;i>=0;i--,j++){
		a.num[j]=sa[i]-'0';
	}
	b.len=sb.size();
	for(int i=b.len-1,j=1;i>=0;i--,j++){
		b.num[j]=sb[i]-'0';
	}
	print(add(a,b));
	print(sub(a,b));
	print(cross(a,b));
	tot=mod(a,b);
	print(tot);
	print(sub(a,cross(b,tot)));
	return 0;
}
2024/8/26 09:45
加载中...