这道题考的是高精度,核心思想就是利用加法模拟乘方。
#include<algorithm>
#include<iostream>
#include<vector>
#include<cmath>
#include<cstring>
#include<stdio.h>
#include<string>
#include<math.h>
using namespace std;
// 函数 add 用于执行大数加法,同时处理进位问题
void add(string &a, string &b) {
int carry = 0;
for (int i = 0; i < a.size(); ++i) {
carry += (a[i] - '0') + (b[i] - '0'); // 将字符转换为整数并加和
a[i] = (carry % 10) + '0'; // 更新当前位的结果,并转换为字符
carry /= 10; // 计算进位
}
if (carry) {
a.push_back('1'); // 如果最后还有进位,添加到字符串末尾
}
}
int main() {
int n;
string d;
cin >> n >> d;
string s;
int decimal_pos; // 小数点位置
// 将数字部分逆序存储到字符串 s 中
for (int i = d.size() - 1, j = 0; i >= 0; --i) {
if (d[i] != '.') {
s.push_back(d[i]);
j++;
} else {
decimal_pos = j - 1; // 记录小数点位置
}
}
// 对 s 进行 n 次倍增,实现乘以 2^n 的效果
for (int i = 1; i <= n; ++i) {
add(s, s);
}
// 四舍五入处理
if (s[decimal_pos] >= '5') {
string b(s.size(), '0');
b[decimal_pos + 1] = '1';
add(s, b);
}
// 输出结果,跳过小数点
for (int i = s.size() - 1; i > decimal_pos; --i) {
cout << s[i];
}
return 0;
}