高精度求助
  • 板块学术版
  • 楼主linxuanrui
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/2/22 23:05
  • 上次更新2023/10/24 00:03:56
查看原帖
高精度求助
857323
linxuanrui楼主2023/2/22 23:05
#pragma GCC optmize(2,3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))
#define abs(a) ((a) > 0 ? (a) : 0 - (a))
#define in(a,b,c) ((a) >= (b) && (a) <= (c))
#define isint(a) (floor(a) == a)
#define endl '\n'
using namespace std;
#define mod 1000000007
int n,k;
struct large_int{
	int a[10000];
	void clear(){
		memset(a,0,sizeof(a));
	}
	void change(string s){
		a[0] = s.size();
		for(int i = s.size();i >= 1;i--)a[i] = s[s.size() - i] - '0';
	}
	void print(){
		for(int i = a[0];i >= 1;i--)cout << a[i];
	}
};
bool operator >(large_int a,large_int b){
	if(a.a[0] != b.a[0])return a.a[0] > b.a[0];
	for(int i = a.a[0];i >= 1;i--){
		if(a.a[i] != b.a[i])return a.a[i] > b.a[i];
	}
	return false;
}
bool operator >=(large_int a,large_int b){
	if(a.a[0] != b.a[0])return a.a[0] > b.a[0];
	for(int i = a.a[0];i >= 1;i--){
		if(a.a[i] != b.a[i])return a.a[i] > b.a[i];
	}
	return true;
}
bool operator <(large_int a,large_int b){
	if(a.a[0] != b.a[0])return a.a[0] < b.a[0];
	for(int i = a.a[0];i >= 1;i--){
		if(a.a[i] != b.a[i])return a.a[i] < b.a[i];
	}
	return false;
}
bool operator <=(large_int a,large_int b){
	if(a.a[0] != b.a[0])return a.a[0] <= b.a[0];
	for(int i = a.a[0];i >= 1;i--){
		if(a.a[i] != b.a[i])return a.a[i] <= b.a[i];
	}
	return true;
}
bool operator ==(large_int a,large_int b){
	for(int i = 0;i <= max(a.a[0],b.a[0]);i++){
		if(a.a[i] != b.a[i])return false;
	}
	return true;
}
bool operator !=(large_int a,large_int b){
	return !(a == b);
}
large_int operator +(large_int a,large_int b){
	large_int c;
	c.a[0] = max(a.a[0],b.a[0]) + 1;
	int jw = 0;
	for(int i = 1;i <= c.a[0];i++){
		c.a[i] = (a.a[i] + b.a[i] + jw) % 10;
		jw = (a.a[i] + b.a[i] + jw) / 10;
	}
	while(c.a[c.a[0]] == 0)c.a[0]--;
	return c;
}
large_int operator -(large_int a,large_int b){
	int tw = 0;
	large_int c;
	for(int i = 1; i <= max(a.a[0],b.a[0]) + 1; i++) {
		c.a[i] = (a.a[i] - b.a[i] - tw + 10) % 10;
		tw = a.a[i] - b.a[i] - tw < 0;
	}
	c.a[0] = max(a.a[0],b.a[0]) + 1;
	while(!c.a[c.a[0]] && c.a[0] > 1)c.a[0]--;
	return c;
}
large_int operator *(large_int a,large_int b){
	large_int c;
	for(int i = 1;i <= a.a[0];i++){
		for(int j = 1;j <= b.a[0];j++){
			c.a[i + j - 1] += (a.a[i] * b.a[j]);
		}
	}
	for(int i = 1;i < a.a[0] + b.a[0];i++){
		if(c.a[i] > 9){
			c.a[i + 1] += c.a[i] / 10;
			c.a[i] %= 10;
		}
	}
	c.a[0] = a.a[0] + b.a[0];
	while(c.a[c.a[0]] == 0 && c.a[0] > 1)c.a[0]--;
	return c;
}
large_int operator /(large_int a,large_int b){
	large_int tmp,c;
	c.clear();
	c.a[0] = a.a[0] - b.a[0] + 1;
	for(int i = c.a[0];i > 0;i--){
		memset(tmp.a,0,sizeof(tmp.a));
		for(int j = 1;j <= b.a[0];j++){
			tmp.a[i + j - 1] = b.a[i];
		}
		tmp.a[0] = b.a[0] + i - 1;
		while(a >= tmp){
			a = a - tmp;
			c.a[i]++;
		}
	}
	while(c.a[c.a[0]] == 0 && c.a[0] > 0) c.a[0]--;
	return c;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int x;
	cin >> x;
	large_int a,tmp,tmp1;
	a.change("1"),tmp.change("2"),tmp1.change("2");
	for(int i = 1;i <= x + 2;i++){
		a = a * tmp;
	}
	(a - tmp1).print();
}

为什么这代码求出的是3n23^n - 2,而不是2n22^n - 2

2023/2/22 23:05
加载中...