赞
踩
这道题考的是高精度,核心思想就是利用加法模拟乘方。
- #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;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。