C++高精辗转相减WA求助
查看原帖
C++高精辗转相减WA求助
616996
Graph楼主2024/4/4 16:56

rt,样例对。

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

int f[10005];
class Bigint
{
public:
	int len,a[10005];
	void init()
	{
		for(int i=0;i<=len+1;i++)
			a[i]=0;
		len=0;
		return ;
	}
	void read()
	{
		init();
		char ch=getchar();
		while(!isdigit(ch))
			ch=getchar();
		while(isdigit(ch))
			a[++len]=ch-'0',ch=getchar();
		reverse(a+1,a+len+1);
		return ;
	}
	void write()
	{
		for(int i=len;i>=1;i--)
			cout<<a[i];
		return ;
	}
	bool operator<(const Bigint &x)const
	{
		if(len!=x.len)
			return len<x.len;
		for(int i=len;i>=1;i--)
			if(a[i]!=x.a[i])
				return a[i]<x.a[i]; 
		return false;
	}
	friend Bigint operator+(Bigint x,Bigint y)
	{
		Bigint ans;
		ans.init();
		int Alen=x.len,Blen=y.len,Clen=max(Alen,Blen),jw=0;
		for(int i=1;i<=Clen;i++)
		{
			ans.a[++ans.len]=(x.a[i]+y.a[i]+jw)%10;
			jw=(x.a[i]+y.a[i]+jw)/10;
		}
		if(jw!=0)
			ans.a[++ans.len]=jw;
		return ans;
	}
	friend Bigint operator-(Bigint x,Bigint y)
	{
		Bigint ans;
		ans.init();
		int Alen=x.len,Blen=y.len,Clen=max(Alen,Blen),tw=0;
		for(int i=1;i<=Clen;i++)
		{
			ans.a[++ans.len]=(x.a[i]-y.a[i]-tw+10)%10;
			if(x.a[i]-y.a[i]-tw<0)
				tw=1;
		}
		while(ans.len>1&&ans.a[ans.len]==0)
			ans.len--;
		return ans;
	}
	friend Bigint operator/(Bigint x,int y)
	{
		int len=x.len,ys=0;
		for(int i=1;i<=len;i++)
			f[i]=x.a[i];
		reverse(f+1,f+len+1);
		Bigint ans;
		ans.init();
		for(int i=1;i<=len;i++)
		{
			int s=(ys*10+f[i])/y;
			if(s!=0)
				ans.a[++ans.len]=s;
			ys=(ys*10+f[i])%y;
		}
		reverse(ans.a+1,ans.a+ans.len+1);
		return ans;
	}
};
void Swap(Bigint &x,Bigint &y)
{
	Bigint z=x;
	x=y;
	y=z;
	return ; 
}

Bigint a,b,ans;
int cnt=0;

signed main()
{
	a.read(),b.read();
	ans.a[++ans.len]=1;
	while(a<b||b<a)
	{
		if(a<b)
			Swap(a,b);
		if(a.a[1]%2==0)
		{
			a=a/2;
			if(b.a[1]%2==0)
			{
				cnt++;
				b=b/2;
			}
		}
		else if(b.a[1]%2==0)
			b=b/2;
		else
			a=a-b;
	}
	while(cnt--)
		a=a+a;
	a.write();
	return 0;
}
2024/4/4 16:56
加载中...