问题描述
小蓝最近在研究一种浮点数的表示方法:RR 格式。对于一个大于 0 的浮点数 dd,可以用 RR 格式的整数来表示。给定一个转换参数 nn,将浮点数转换为 RR 格式整数的做法是:
将浮点数乘以 2n2n;
四舍五入到最接近的整数。
输入格式
一行输入一个整数 nn 和一个浮点数 dd,分别表示转换参数,和待转换的浮点数。
输出格式
输出一行表示答案:dd 用 RR 格式表示出来的值。
样例输入
2 3.14
样例输出
13
样例说明
3.14×22=12.563.14×22=12.56,四舍五入后为 1313。
评测用例规模与约定
对于 50%50% 的评测用例:1≤n≤10,1≤1≤n≤10,1≤ 将 dd 视为字符串时的长度 ≤15≤15。
对于 100%100% 的评测用例:1≤n≤1000,1≤1≤n≤1000,1≤ 将 dd 视为字符串时的长度 ≤1024≤1024;保证 dd 是小数,即包含小数点。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string d; //数太大用字符数组读
cin>>n>>d;
vector<int>b; //开vetor好处就是可以用push_back进位的时候可以在后面直接加
int sum=0,k=0;
for(int i=d.size()-1;i>=0;i--)
{
if(d[i]!='.')
b.push_back(d[i]-'0'); //把字符型变成整数型
else {k=sum;}
sum++; //找到小数点位置为以后输出做铺垫,现在就可以看作一个大整数了
}
int u=b.size();
while(n--) //指数类型太大,保存不了,故每次*2
{
int t=0;
for(int i=0;i<b.size();i++)
{
b[i]=b[i]*2+t; //t是进位的数
if(b[i]>=10)
{
t=b[i]/10;
b[i]=b[i]%10;
}
else t=0;
}
if(t)
b.push_back(t);
} //模拟数学过程
u=b.size();
int t=1;
if(k&&b[k-1]>=5){ // 四舍五入过程
for(int i=k;i<u;i++)
{
b[i]=b[i]+1;
if(b[i]<=9){t=0;break;}
else b[i]-=10;
}
if(t) b.push_back(t);
}
for(int i=b.size()-1;i>=k;i--)
cout<<b[i];
return 0;
}