高精

版权声明:转载请注明出处 https://blog.csdn.net/qq_41593522/article/details/83993889

题意

高精,各种高精

题解

调试记录

struct longint{
	int a[maxl], len, opt;
	longint(){ memset(a, 0, sizeof a); len = 0; opt = 1; }
	//read & write
	void read(){
		char str[maxl]; scanf("%s", str + 1);
		for (int i = strlen(str + 1); i >= 1; i--)
			a[strlen(str + 1) - i + 1] = (str[i] & 15);
		len = strlen(str + 1);
	}
	void write(){
		if (opt == -1) putchar('-');
		for (int i = len; i >= 1; i--) putchar(a[i] + 48);
		putchar('\n');
	}
	//compare
	bool operator == (longint x){
		if (len != x.len) return false;
		for (int i = len; i >= 1; i--)
			if (a[i] != x.a[i]) return false;
		return true;
	}
	bool operator > (longint x){
		if (len > x.len) return true;
		if (len < x.len) return false;
		for (int i = len; i >= 1; i--)
			if (a[i] > x.a[i]) return true;
			else if (a[i] < x.a[i]) return false;
		return false;
	}
	bool operator < (longint x){ return !(*this > x) && !(*this == x); }
	bool operator <=(longint x){ return !(*this > x); }
	bool operator >=(longint x){ return !(*this < x); }
	//calculate
	longint operator +(longint x){
		longint res; res.len = max(x.len, len);
		for (int i = 1; i <= max(x.len, len); i++){
			res.a[i] += x.a[i] + a[i];
			if (res.a[i] > 9){
				res.a[i + 1] += res.a[i] / 10;
				res.a[i] %= 10;
			}
		}
		if (res.a[res.len + 1] != 0) res.len++;
		while (res.a[res.len] > 9){
			res.a[res.len + 1] = res.a[res.len] / 10;
			res.a[res.len++] %= 10;
		}
		return res;
	}
	longint operator +(int x){
		longint res = *this;
		res.a[1] += x;
		int i = 1;
		while (res.a[i] > 9) res.a[i + 1] += res.a[i] / 10, res.a[i] %= 10, ++i;
		res.len = max(res.len, i);
		return res;
	}
	longint operator -(longint x){
		longint res = *this;
		if (res < x) swap(res, x), res.opt = -1;
		res.len = max(res.len, x.len);
		for (int i = 1; i <= res.len; i++){
			res.a[i] -= x.a[i];
			if (res.a[i] < 0){
				res.a[i] += 10;
				res.a[i + 1]--;
			}
		}
		while (res.a[res.len] == 0 && res.len > 1) res.len--;
		return res;
	}
	longint operator *(longint x){
		longint res; res.len = len + x.len;
		for (int i = 1; i <= len; i++)
			for (int j = 1; j <= x.len; j++)
				res.a[i + j - 1] += a[i] * x.a[j];
		for (int i = 1; i <= res.len; i++)
			if (res.a[i] > 9){
				res.a[i + 1] += res.a[i] / 10;
				res.a[i] %= 10;
			}
		while (res.a[res.len] == 0 && res.len > 1) res.len--;
		return res;
	}
	longint operator *(int x){
		longint res = *this;
		for (int i = 1; i <= res.len; i++){
			res.a[i] *= x;
		}
		for (int i = 1; i <= res.len; i++)
			if (res.a[i] > 9){
				res.a[i + 1] += res.a[i] / 10, res.a[i] %= 10;
				if (i == res.len) res.len = res.len + 1;
			}
		while (res.a[res.len] > 9){
			res.a[res.len + 1] += res.a[res.len] / 10;
			res.a[res.len++] %= 10;
		}
		return res;
	}
	longint operator /(int x){
		longint res;
		int d = 0;
		for (int i = len; i >= 1; i--){
			res.a[i] = (d * 10 + a[i]) / x;
			d = (d * 10 + a[i]) % x;
		} 
		res.len = len;
		while (res.a[res.len] == 0 && res.len > 1) res.len--;
		return res;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_41593522/article/details/83993889