求助高精GCD
查看原帖
求助高精GCD
385093
uniqueharry楼主2021/4/29 15:55

RT,没压位的时候只有AC和TLE,压位后只有AC和WA,大概自己是实在找不出来压位的时候哪里出锅了,请各位路过的大佬若有时间不吝赐教,万分感谢。

(压的是8位)

code:

#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
const int mod = 100000000;
struct bigint
{
	int len,x[N];
	int &operator[](int i)
	{
		return x[i];
	}
	void flatten(int L)
	{
		len = L;
		for(int i=1;i<=len;i++)
		    x[i + 1] += x[i] / mod, x[i] %= mod;
		for(;!x[len];)
		    len--;
	}
	void print()
	{
		for(int i=len;i>=1;i--)
		{
			if(i == len)
			    printf("%d",x[i]);
			else
			    printf("%08d",x[i]);
		}
	}
	bool operator < (const bigint&k) const
	{
		if(len < k.len) return true;
		if(len > k.len) return false;
		for(int i=len;i>=1;i--)
		{
			if(x[i] < k.x[i]) return true;
			if(x[i] > k.x[i]) return false;
		}
		return false;
	}
	bool operator == (const bigint&k) const
	{
		return !(k < *this) && !(*this < k);
	} 
};
bigint operator-(bigint num1,bigint num2)
{
	bigint c;
	int len_ = num1.len;
	for(int i=1;i<=len_;i++)
	    c[i] = (num1[i] - num2[i]);
	c.len = len_;
	for(int i=1;i<=len_;i++)
	{
		if(c[i] < 0) 
		{
			c[i] += mod;
			c[i + 1]--;
		}
	}
	while(!c[c.len]) 
		c.len--;
	return c;
}
bigint operator*(bigint num,int num_)
{
	bigint c;
	int len_ = num.len;
	for(int i=1;i<=len_;i++)
        c[i] = num[i] * num_;
	c.flatten(len_ + 1);
	return c;
}
bigint operator/(bigint num,int num_)
{
	bigint c,d;
	c.len = 0;
	int len_ = num.len,flag = 0;
	long long now = 0;
	for(int i=len_;i>=1;i--)
	{
		now = now * mod + num[i];
		if(now / num_ != 0) flag = 1;
		if(now / num_ == 0 && !flag) continue;
		c[++c.len] = (now / num_);
		now %= num_;
	}
	for(int i=1;i<=c.len;i++)
	    d[i] = c[c.len - i + 1];
	d.len = c.len;
	return d;
}
string str1,str2;
bigint a,b,tmp,ans;
int lena,lenb,len_a,len_b,T,now,ten;
void gcd(int t)
{
	if(a == b)
	{
		T = t;
		ans = a;
		return;
	}
	if(a < b)
	{
		swap(a,b);
		gcd(t);
		return;
	}
	if(a[1] % 2 == 0)
	{
		a = a / 2;
		if(b[1] % 2 == 0)
		{
			b = b / 2;
			gcd(t + 1);
			return;
		}
		else
		{
			gcd(t);
			return;
		}
			
	}
	else
	{
		if(b[1] % 2 == 0)
		{
			b = b / 2;
			gcd(t);
			return;
		}
		else 
		{
			a = a - b;
			gcd(t);
			return;
		}
	}
}
int main()
{
	cin>>str1>>str2;
	lena = str1.length();
	lenb = str2.length();
	for(int i=lena - 1;i>=0;i--)
	{
		if((lena - i) % 8 == 1) ten++;
		else ten *= 10;
		now += (str1[i] - '0') * ten;
		if((lena - i) % 8 == 0 || i == 0)
		{
			a[++len_a] = now;
			now = 0;
			ten = 0;
		}
	}
	a.len = len_a;
	now = ten = 0;
	for(int i=lenb - 1;i>=0;i--)
	{
		if((lenb - i) % 8 == 1) ten++;
		else ten *= 10;
		now += (str2[i] - '0') * ten;
		if((lenb - i) % 8 == 0 || i == 0)
		{
			b[++len_b] = now;
			now = 0;
			ten = 0;
		}
	}
	b.len = len_b;
	gcd(0);
	for(int i=1;i<=T;i++)
	    ans = ans * 2;
	ans.print();
	return 0;
}
2021/4/29 15:55
加载中...