题目描述
小蓝最近在研究一种浮点数的表示方法: R格式。对于一个大于0的浮点数d
可以用R格式的整数来表示。给定一个转换参数n,将浮点数转换为R格式
整数的做法是:
1.将浮点数乘以2ⁿ;
2.四五入到最接近的整数。
输入格式
一行输入一个整数n和一个浮点数d,分别表示转换参数,和待转换的浮点
数。
输出格式
输出一行表示答案: d用R格式表示出来的值。
样例输入
2 3.14
样例输出
13
样例说明
3.14 x 2²= 12.56,四舍五入后为13。
评测用例规模与约定
对于50%的评测用例:1<n≤10,1≤将d视为字符串时的长度<15。
对于100%的评测用例:1≤n≤1000,1≤将d视为字符串时的长度≤1024;保证d是小数,即包含小数点。
高精度
一个数乘2ⁿ,即乘n次2,用高精度记录数,不断连乘2
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string d;
deque<int> a;
cin >> n >> d;
// 将d存入a
for (int i = 0; i < d.size(); i++)
{
// 遇到小数点,存为-1
if (d[i] == '.')
a.push_back(-1);
else
a.push_back(d[i] - '0');
}
// 乘n次2
while (n--)
{
// 进位
int c = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] != -1)
{
a[i] = a[i] * 2 + c;
c = a[i] / 10;
a[i] %= 10;
}
}
// 首位进位
if (c)
a.push_front(c);
}
// 四舍五入并输出
for (int i = 0; i < a.size(); i++)
{
// 遇到小数点结束
if (a[i] == -1)
break;
// 小数点前一位四舍五入
if (a[i + 1] == -1 && a[i + 2] > 4)
a[i]++;
cout << a[i];
}
return 0;
}