高精板子求助
  • 板块学术版
  • 楼主meifan666
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/26 14:30
  • 上次更新2024/8/26 16:33:58
查看原帖
高精板子求助
1284088
meifan666楼主2024/8/26 14:30

除法那里不知怎么了,死活进不去

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct bigint {
	int len;
	short num[100100];
};
string sa, sb;
bigint a, b, tot;
void print(bigint x) {
	for (int i = x.len; i > 0; i--) {
		cout << x.num[i];
	}
	cout << '\n';
	return;
}
bool over(bigint x, bigint y) { //x大于y
	if (x.len > y.len)return 1;
	if (x.len < y.len)return 0;
	for (int i = x.len; i >= 1; i--) {
		if (x.num[i] > y.num[i])return 1;
		if (x.num[i] < y.num[i])return 0;
	}
	return 0;
}
bigint add(bigint x, bigint y) {
	bigint ans;
	memset(ans.num, 0, sizeof(ans.num));
	ans.len = max(x.len, y.len);
	for (int i = 1; i <= ans.len; i++) {
		ans.num[i] += x.num[i] + y.num[i];
		if (ans.num[i] >= 10) {
			ans.num[i + 1] += ans.num[i] / 10;
			ans.num[i] %= 10;
		}
	}
	if (ans.num[ans.len + 1])ans.len++;
	return ans;
}
bigint cross(bigint x, bigint y) {
	bigint ans;
	memset(ans.num, 0, sizeof(ans.num));
	ans.len = x.len + y.len - 1;
	for (int i = 1; i <= x.len; i++) {
		for (int j = 1; j <= y.len; j++) {
			ans.num[i + j - 1] += x.num[i] * y.num[j];
			if (ans.num[i + j - 1] >= 10) {
				ans.num[i + j] += ans.num[i + j - 1] / 10;
				ans.num[i + j - 1] %= 10;
			}
		}
	}
	if (ans.num[x.len + y.len])ans.len++;
	while (ans.num[ans.len] == 0 && ans.len > 1)ans.len--;
	return ans;
}
bigint sub(bigint x, bigint y) {
	bigint ans;
	memset(ans.num, 0, sizeof(ans.num));
	if (over(y, x) ){
		cout << "-";
		swap(x,y);
	}
	for (int i = 1; i <= x.len; i++) {
		ans.num[i] = x.num[i] - y.num[i];
	}
	for (int i = 1; i <= x.len; i++) {
		if (ans.num[i] < 0) {
			ans.num[i] += 10;
			ans.num[i + 1] -= 1;
		}
	}
	ans.len = x.len;
	while (ans.num[ans.len] == 0 && ans.len > 1)ans.len--;
	return ans;
}
bigint half(bigint x) {
	bigint ans = x;
	ans.len = x.len;
	if (x.num[x.len] < 2 && ans.len > 1)ans.len--;
	for (int i = x.len; i > 1; i--) {
		ans.num[i - 1] += ans.num[i] % 2 * 10;
		ans.num[i] /= 2;
	}
	ans.num[1] /= 2;
	return ans;
}
bigint mod(bigint x, bigint y) {
//	cout << "OK";
	bigint l, r = x, t, ans;
	l.len = 1;l.num[1] = 0;
	t.len = 1;t.num[1] = 1;
	while (!over(l, r)) { //while(l<=r)
		bigint mid = half(add(l, r));
		if (!over(cross(mid, y), x)) {
			ans = mid;
			l = add(mid, t);
		} else {
			r = sub(mid, t);
		}
	}
	return ans;
}
signed main() {
	cin >> sa >> sb;
	a.len = sa.size();
	for (int i = a.len - 1, j = 1; i >= 0; i--, j++) {
		a.num[j] = sa[i] - '0';
	}
	b.len = sb.size();
	for (int i = b.len - 1, j = 1; i >= 0; i--, j++) {
		b.num[j] = sb[i] - '0';
	}
	tot = add(a, b);
	print(tot);
	tot = sub(a, b);
	print(tot);
	tot = cross(a, b);
	print(tot);
	tot = mod(a, b);
	print(tot);
	print(sub(a,cross(b,tot)));
	return 0;
}
2024/8/26 14:30
加载中...