大佬求助
查看原帖
大佬求助
745235
CharlieLee楼主2023/12/5 20:17

为啥压8位还是T了两个点,我不理解

#include<bits/stdc++.h>
using namespace std;
const int M=1e8;
struct bignum{
	int len;
	long long d[1255];
	bignum(){
		len=1;
		memset(d,0,sizeof(d));
	}
	void read(){
		string s;
		cin>>s;
		len=0;
		int k=M,l=s.size();
		for(int i=1;i<=l;i++,k*=10){
			if(k==M) k=1,len++;
			d[len]+=(s[l-i]-'0')*k;
		}
	}
	void write(){
		cout<<d[len];
		for(int i=len-1;i>=1;i--){
			printf("%0.8d",d[i]);
		}
		cout<<endl;
	}
};
bignum operator - (bignum x,bignum y){
	bignum ans;
	ans.len=max(x.len,y.len);
	for(int i=1;i<=ans.len;i++){
		ans.d[i]+=x.d[i]-y.d[i];
		if(ans.d[i]<0) ans.d[i+1]--,ans.d[i]+=M;
	}
	while(ans.len>1&&(!ans.d[ans.len])) ans.len--;
	return ans;
}
bignum operator * (bignum x,bignum y){
	bignum z;
	z.len=x.len+y.len-1;
	for(int i=1;i<=x.len;i++){
		for(int j=1;j<=y.len;j++){
			z.d[i+j-1]+=x.d[i]*y.d[j];
			z.d[i+j]+=z.d[i+j-1]/M;
			z.d[i+j-1]%=M;		
		}
	}
	if(z.d[z.len+1]!=0) z.len++;
	while(z.len>1&&z.d[z.len]==0) z.len--;
	return z;
}
bignum operator / (bignum x,int y){
	bignum res;
	res.len=x.len;
	long long t=0;
	for(int i=res.len;i>=1;i--){
		t=t*M+x.d[i];
		res.d[i]=t/y;
		t=t%y;
	}
	while(res.len>1&&res.d[res.len]==0) res.len--;
	return res;
}
char max(bignum a,bignum b){
	if(a.len>b.len) return 'a';
	else if(a.len<b.len) return 'b';
	for(int i=a.len;i>=1;i--){
		if(a.d[i]<b.d[i]) return 'b';
		if(b.d[i]<a.d[i]) return 'a';
	}
	return 'a';
}
int main(){
	bignum a,b;
	a.read();
	b.read();
//	a.write();
//	cout<<' ';
//	b.write();
//	cout<<endl;
	int cnt=0;
	while(!(a.len==1&&a.d[1]==0)&&!(b.len==1&&b.d[1]==0)){
		if((a.d[1]==0||a.d[1]==2||a.d[1]==4||a.d[1]==6||a.d[1]==8)&&(b.d[1]==0||b.d[1]==2||b.d[1]==4||b.d[1]==6||b.d[1]==8)){
			cnt++;
			a=a/2;
			b=b/2;
//			a.write();
//			cout<<' ';
//			b.write();
//			cout<<endl;
			continue;
		}
		else if((a.d[1]==0||a.d[1]==2||a.d[1]==4||a.d[1]==6||a.d[1]==8)&&(b.d[1]==1||b.d[1]==3||b.d[1]==5||b.d[1]==6||b.d[1]==9)){
			a=a/2;
//			a.write();
//			cout<<' ';
//			b.write();
//			cout<<endl;
			continue;
		}
		else if((b.d[1]==0||b.d[1]==2||b.d[1]==4||b.d[1]==6||b.d[1]==8)&&(a.d[1]==1||a.d[1]==3||a.d[1]==5||a.d[1]==6||a.d[1]==9)){
			b=b/2;
//			a.write();
//			cout<<' ';
//			b.write();
//			cout<<endl;
			continue;
		}
		else if(max(a,b)=='a'){
			a=a-b;
//			a.write();
//			cout<<' ';
//			b.write();
//			cout<<endl;
			continue;
		}
		else{
			b=b-a;
//			a.write();
//			cout<<' ';
//			b.write();
//			cout<<endl;
			continue;
		}
	}
//	cout<<"cnt="<<cnt<<endl;
	bignum two;
	two.d[1]=2;
	if(a.len==1&&a.d[1]==0){
		for(int i=1;i<=cnt;i++){
			b=b*two;
		}
		b.write();
		return 0;
	}
	else{
		for(int i=1;i<=cnt;i++){
			a=a*two;
		}
		a.write();
		return 0;
	}
	return 0;
}
2023/12/5 20:17
加载中...