问题描述
小蓝最近在研究一种浮点数的表示方法:R 格式。
对于一个大于 0 的浮点数 d
,可以用 R 格式的整数来表示。
给定一个转换参数 n
,将浮点数转换为 R 格式整数的做法是:
- 将浮点数乘以
2^n
; - 将结果四舍五入到最接近的整数。
输入格式
一行输入一个整数 n
和一个浮点数 d
,分别表示转换参数和待转换的浮点数。
输出格式
输出一行表示答案:d
用 R 格式表示出来的值。
样例输入
2 3.14
样例输出
13
样例说明
3.14 × 2^2 = 12.56,四舍五入后为 13。
评测用例规模与约定
- 对于 50% 的评测用例:
1 ≤ n ≤ 10,d 的字符串长度 ≤ 15; - 对于 100% 的评测用例:
1 ≤ n ≤ 1000,d 的字符串长度 ≤ 1024,保证d
是小数(即包含小数点)。
c++代码
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
int n;
string d;
string highmutiple(string a, string b) {
if (a == "0" || b == "0") return "0";
int m = a.size(), n = b.size();
vector<int> aa(m), bb(n), cc(m + n, 0);
for (int i = 0; i < m; i++) {
aa[i] = a[m - i - 1] - '0';
}
for (int i = 0; i < n; i++) {
bb[i] = b[n - i - 1] - '0';
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cc[i + j] += aa[i] * bb[j];
cc[i + j + 1] += cc[i + j] / 10;
cc[i + j] %= 10;
}
}
string c;
int k = m + n - 1;
while(cc[k] == 0) k--;
while(k >= 0) {
c += to_string(cc[k]);
k--;
}
return c;
}
string addone(string a) {
int m = a.size();
vector<int> aa(m + 1);
for (int i = 0; i < m; i++) {
aa[i] = a[m - i - 1] - '0';
}
aa[0]++;
for (int i = 0; i < m; i++) {
aa[i + 1] += aa[i] / 10;
aa[i] %= 10;
}
string b;
int k = m;
if (aa[m] == 0) k--;
while(k >= 0) {
b += to_string(aa[k]);
k--;
}
return b;
}
int main() {
cin >> n >> d;
string a = "1";
while(n--) {
a = highmutiple(a, "2");
}
int k = d.find(".");
d.erase(k, 1);
string ans = highmutiple(a, d);
string zhen = ans.substr(0, ans.size() - (d.size() - k));
if (ans[ans.size() - (d.size() - k)] >= '5') zhen = addone(zhen);
cout << zhen;
return 0;
}//by wqs
解题思路
高精度问题
计算的时候把小数点去掉,记录小数点后面有多少位。d有多少位小数,答案就有多少位小数
四舍五入只要判断小数点后的一位是不是比5大就行了。