题目描述
小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R 格式整数的做法是:
- 将浮点数乘以 2的n次方;
- 四舍五入到最接近的整数。
输入格式
一行输入一个整数 𝑛n 和一个浮点数 𝑑d,分别表示转换参数,和待转换的浮 点数。
输出格式
输出一行表示答案:𝑑d 用 𝑅R 格式表示出来的值。
样例
输入数据 1
2 3.14
Copy
输出数据 1
13
Copy
解释 #1
3.14×22=12.563.14×22=12.56,四舍五入后为 1313。
数据范围
-
数据范围
- 对于 50%50% 的评测用例:1≤𝑛≤101≤n≤10,1≤1≤ 将 𝑑d 视为字符串时的长度 ≤15≤15。
- 对于 100%100% 的评测用例:1≤𝑛≤10001≤n≤1000,1≤1≤ 将 𝑑d 视为字符串时的长度 ≤1024≤1024;保证 𝑑d 是小数,即包含小数点。
-
//本题考察的是高精度基础算法可以用乘法做也可以用加法做,本题用的乘法 #include<iostream> #include<string.h> #include<vector> using namespace std; vector<int> f(vector<int> &A,int l) { vector<int> C;//这里再开个动态数组用来表示A*2的结果 int t=0; for(int i=0;i<A.size();i++) { t+=A[i]*l; C.push_back(t%10); t=t/10; } while(t) { C.push_back(t%10); t=t/10; } while(C.size()>1&&C.back()==0)//去除前导0 C.pop_back(); return C; } int main() { int n; cin>>n; string a; cin>>a; vector<int> A;//开个动态数组 int k;//表示小数点的位置 for(int i=a.size()-1;i>=0;i--) { if(a[i]!='.') { A.push_back(a[i]-'0'); } else { k=a.size()-i-1; } } //对A进行n次乘2的循环 while(n--) { A=f(A,2); } if(A[k-1]>=5)//判断是否可以进位 { A[k]+=1; } int t=0; vector<int> C; for(int i=k;i<=A.size()-1;i++) { t+=A[i]; C.push_back(t%10); t=t/10; } while(t) { C.push_back(t%10); t=t/10; } while(C.size()>1&&C.back()==0) C.pop_back(); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; }