高精求小数幂 (高精度乘法 + 大数重载)
看了题解做出来的,只是在输出部分加了一些优化,这题比较经典
https://www.luogu.com.cn/problem/P1517
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1300;
struct Bign {
int s[MAXN], len;
//初始化Bign结构体
Bign (int num = 0) {
//初始化s数组
memset(s, 0, sizeof(s));
len = 1;
s[1] = num;
}
//去除前导0
auto clean() {
while(len > 1 && s[len] == 0) len--;
}
//重载*运算符
Bign operator * (int b) const {
Bign ans;
//防止溢出
ans.len = len + 10;
//高精度相乘
for(int i = 1; i <= ans.len; i++) {
ans.s[i] += s[i] * b;
ans.s[i + 1] += (ans.s[i] / 10);
ans.s[i] %= 10;
}
//去除前导0
ans.clean();
return ans;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
double a;
int n;
while(cin >> a >> n) {
//计算ans的小数位数
int point = 0;
while(fabs(a - round(a)) > 1e-6) {
a *= 10;
point++;
}
point *= n;
//求解ans
Bign ans = 1;
//这里是一个细节
int b = (int) round(a);
// cout << b << " " << point << endl;
for(int i = 1; i <= n; i++) {
ans = ans * b;
}
//将ans输出
for(int k = max(ans.len, point); k > 0; k--) {
if(k == point) cout << '.';
cout << ans.s[k];
}
cout << endl;
}
return 0;
}