RE求助!!!!!!!!!!
查看原帖
RE求助!!!!!!!!!!
524906
刘辰雨楼主2021/11/17 21:23

几乎全RE

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cmath>
#define M1  1000000000LL
#define M2  9
using namespace std;
char s[999999];
struct bignum
{
	long long num[1700] ;
	int k;
	bignum(){k=0;memset(num,0,sizeof(num));	}
	void read()
	{

		scanf("%s" , s);
		int len = strlen(s);
		if(len%M2==0)k = len/M2;
		else k = len/M2 + 1;
		int n = 0 , m = 1;
		long long t = 0;
		int base = 1;
		for(int i = len-1 ; i>= 0 ; i--)
		{

			t += (s[i]-'0')*base;
			base *= 10;
			n++;
			if(n % 9 ==0 || n >= len)
			{
				num[m] = t;
				t = 0LL;
				base = 1;
				m++;
			}

		}
	}
	void print()
	{
		printf("%lld" , num[k]);
		for(int i = k-1 ; i >= 1 ; i--)
		{
			printf("%09lld" , num[i]);
		}
	}
	void addfix()
	{
		for(int i = 1 ; i<k ; i++ )
		{
			num[i+1] += num[i]/M1;
			num[i] %= M1;
		}
		while(num[k] >= M1)
		{
			num[k+1] += num[k]/M1;
			num[k]%=M1;k++;
		}
		while(k > 0&&num[k] == 0)k--;
	}
	void minufix()
	{
		for(int i = 1 ; i < k ; i++ )
		{
			if(num[i] < 0)
			{
				num[i] += M1;
				num[i+1] -= 1;
			}
		}
		while(k > 0 && num[k] == 0) k--;
	}
};

bool operator < (bignum a , bignum b)
{
	if(a.k != b.k)return a.k<b.k ;
	for(int i = a.k ; i>= 1 ; i--)
	{
		if(a.num[i] != b.num[i])
			return a.num[i] < b.num[i];
	}
	return false;
}
bool operator >= (bignum a , bignum b)
{
	if(a.k > b.k)
	{
		return true ;
	}
	else if(a.k < b.k)
		{
		return false ;
	}
	for(int i = a.k ; i>= 1 ; i--)
	{
		if(a.num[i] > b.num[i])
		{
					return true;
		}
		if(a.num[i] < b.num[i])
		{
					return false;
		}

	}
	return true;
}
bool operator == (bignum a , bignum b)
{
	if(a.k!=b.k)return false;
	for(int i = a.k ; i>= 1 ; i-- )
	{
		if(a.num[i] != b.num[i])return false;
	}
	return true;
}
bool operator != (bignum a , long long b)
{
	if(a.k>1||a.num[1]!=b) return true;
	return false;
}
bignum operator - (bignum a , bignum b)
{
	bignum reslt=a;
	int len = min(a.k , b.k);
	for(int i = 1 ; i<= len ; i++ )
	{
		reslt.num[i] -= b.num[i];
	}
	reslt.minufix();
	return reslt;
}
bignum operator * (bignum a , bignum b)
{
	bignum reslt;
	reslt.k = a.k+b.k-1;
	for(int i = 1 ; i<= a.k ; i++ )
	{
		for(int j = 1 ; j <= b.k ; j++)
		{
			reslt.num[i+j-1] += a.num[i]*b.num[j];
		}
	}
	reslt.addfix();
	return reslt;
}
bignum operator * (bignum a , long long b)
{
	bignum reslt;
	reslt.k = a.k;
	for(int i = 1 ; i<= a.k ; i++ )
	{
		reslt.num[i] += a.num[i] * b;
	}
	reslt.addfix();
	return reslt;
}
bignum operator / (bignum &a , long long b)
{
	for(int i = a.k ; i >= 1 ; i-- )
	{
		a.num[i-1] += a.num[i]%b * M1;
		a.num[i] /= b;
	}
	a.addfix();
	return a;
}
bignum operator % (bignum a , bignum b)
{
	if(a<b)return a;
	int s = 1;
	while(a.k > b.k)
	{
		b = b*M1;
		s+=M2;
	}
	while(a.num[a.k] > b.num[b.k])
	{
		b = b*10LL;
		s++;
	}
	while(s>0)
	{
		while(a>=b)
		{
			a = a-b ;
		}
		b = b/10LL;
		s--;
	}
	return a;
}
bignum super_gcd(bignum a , bignum b)
{
	bignum c;
    while(b != 0LL)
    {
    	c=a%b;
    	a=b;b=c;
    }
	return a;
}

bignum A , B;
int main()
{
	A.read();
	B.read();
    super_gcd(A,B).print();
	return 0;
}
/*
10000000000000000000000000000005 3
*/
2021/11/17 21:23
加载中...