时间限制: 1.0s 内存限制: 256.0MB 本题总分:10分
【问题描述】
小蓝最近在研究一种浮点数的表示方法:R格式。对于一个大于0的浮点 数d,可以用R格式的整数来表示。给定一个转换参数n,将浮点数转换为R 格式整数的做法是:
1. 将浮点数乘以2^n;
2. 四舍五入到最接近的整数。
【输入格式】 一行输入一个整数n和一个浮点数d,分别表示转换参数,和待转换的浮点数。
【输出格式】 输出一行表示答案:d用R格式表示出来的值。
【样例输入】 2 3.14
【样例输出】 13
【样例说明】 3.14 × 2^2 = 12.56,四舍五入后为 13。
【评测用例规模与约定】
对于50%的评测用例:1≤n≤10,1≤将d 视为字符串时的长度≤15。
对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度 ≤ 1024;保证 d 是小数,即包含小数点。
问题分析
因为小数最多1024位,而double类型最多储存16位,n最多1000。所以使用double精度肯定不行。所以使用字符串处理,类似于大数加法。代码如下:
#include<iostream> #include<string.h> using namespace std; string fun(string x) { string s; int len=x.size()-1; int flag=0; while(len>=0||flag>0) { if(len>=0&&x[len]=='.') s.insert(s.begin(),'.'); else { int num=len<0?0:x[len]-'0'; int sum=2*num+flag; flag=sum/10; s.insert(s.begin(),sum%10+'0'); } len--; } return s; } int main() { int n; string d; cin>>n>>d; while(n) { d=fun(d); n--; } for(int i=0;;i++) { if(d[i]=='.') { if(d[i+1]>='5') d[i-1]++; d=d.substr(0,i); break; } } cout<<d; return 0; }