P2293 高精度开根 麻烦改下代码,没有输出...
  • 板块题目总版
  • 楼主代码小明
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/8/30 11:53
  • 上次更新2023/11/4 08:34:08
查看原帖
P2293 高精度开根 麻烦改下代码,没有输出...
323785
代码小明楼主2021/8/30 11:53

P2293{\color{Goldenrod}P2293}

麻烦dalao改下代码,没有输出,代码里有注释

裸的高精都卡了,太蒻了

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

struct js {
	int len;
	int nums[10010];
};
int sum;
string s;
js t;
js L, R, mid;
js cheng(js a, js b) {
	js c;
	for (int i = 1; i <= a.len; i++) {
		int x = 0;                                             //用于存放进位
		for (int j = 1; j <= b.len; j++) {              //对乘数的每一位进行处理
			c.nums[i + j - 1] = a.nums[i] * b.nums[j] + x + c.nums[i + j - 1]; //当前乘积 +上次乘积进位 +原数
			x = c.nums[i + j - 1] / 10;
			c.nums[i + j - 1] %= 10;
		}
		c.nums[i + b.len] = x;                              //进位
	}
	c.len = a.len + b.len;
	while (c.nums[c.len] == 0 && c.len > 1) //删除前导0
		c.len--;
	return c;
}
js pown(js a) {
	js ans;
	ans.len = 1, ans.nums[1] = 1;
	for (int i = 0; i < sum; i++)
		ans = cheng(ans, a);
	return ans;
}
js jia(js a, js b) {
	js c;
	for (int i = 1; i <= c.len; i++) {
		c.nums[i] += a.nums[i] + b.nums[i];
		c.nums[i + 1] = c.nums[i] / 10;
		c.nums[i] %= 10;
	}
	return c;
}
js pj(js a, js b) {
	js ans;
	ans = jia(a, b);
	for (int i = ans.len; i >= 2; i++) {
		ans.nums[i - 1] += (ans.nums[i] % 2) * 10;	//CSP代码
		ans.nums[i] /= 2;
	}
	ans.nums[1] /= 2;
	while (ans.nums[ans.len] == 0)
		ans.len--;
	return ans;
}
js jiaer(js a) {
	js ans;
	ans = a;
	ans.nums[1] += 2;
	int i = 1;
	while ((i <= ans.len) && (ans.nums[i] >= 10)) {
		ans.nums[i + 1] += ans.nums[i] / 10;
		ans.nums[i] %= 10;
		i++;
	}
	if (ans.nums[ans.len + 1] > 0)
		ans.len++;
	return ans;
}
bool maxmin(js a, js b) {
//	若大整数 a>b 则返回 true,否则返回 false
	if (a.len < b.len) return false;
	if (a.len > b.len) return true;
	for (int i = a.len; i >= 1; i--) {
		if (a.nums[i] < b.nums[i])return false;
		if (a.nums[i] > b.nums[i]) return true;
	}
	return false;
}
int main() {
//	freopen("英文小写文件名.in","r",stdin);
//	freopen("英文小写文件名.out","w",stdout);
	cin >> sum >> s;
	if (s == "0") {
		cout << 0;
		return 0;
	}
	t.len = s.length();
	for (int i = 1; i <= t.len; i++)
		t.nums[i] = s[t.len  - i] - '0';
	L.len = 1, L.nums[1] = 1, R = t;
	while (!maxmin(jiaer(L), R)){
		mid = pj(L, R);
		if (maxmin(pown(mid), t)) R = mid;
		else L = mid;
	} 
	for (int i = L.len; i >= 1; i--)
		cout << L.nums[i];
	cout << endl;
	return 0;
}
2021/8/30 11:53
加载中...