P10425(洛谷题面

题目

题目描述:

小蓝最近在研究一种浮点数的表示方法:RR 格式。对于一个大于 00 的浮点数 dd,可以用 RR 格式的整数来表示。给定一个转换参数 nn,将浮点数转换为 RR 格式整数的做法是:

  1. 将浮点数乘以 2n2^n
  2. 四舍五入到最接近的整数。

输入格式:

一行一个整数 nn 和一个浮点数 dd

输出格式:

一行一个整数表示 ddRR 格式表示出的值。

数据范围与说明:

样例 1 解释

3.14×22=12.563.14 \times 2^2 = 12.56,四舍五入后为 1313

数据规模与约定

tt 表示将 dd 视为字符串时的长度。

  • 对于 50%50\% 的数据,保证 n10n \le 10t15t \le 15
  • 对于全部的测试数据,保证 1n10001 \le n \le 10001t10241 \le t \le 1024,保证 dd 是小数,即包含小数点。

输入输出样例 #1

输入:

1
2 3.14

输出:

1
13

题意

简述:

小蓝最近在研究一种浮点数的表示方法:RR 格式。对于一个大于 00 的浮点数 dd,可以用 RR 格式的整数来表示。给定一个转换参数 nn,将浮点数转换为 RR 格式整数的做法是:

  1. 将浮点数乘以 2n2^n
  2. 四舍五入到最接近的整数。

代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<bits/stdc++.h>
using namespace std;
int n,l;
string d;
int a[1000000];
void func(){
for(int i=1;i<=l;i++){
a[i]*=2;
}
for(int i=1;i<=l;i++){
a[i+1]+=a[i]/10;
a[i]%=10;
}
if(a[l+1]){
l++;
}
}
int main(){
cin>>n>>d;
reverse(d.begin(),d.end());
int index=d.find(".");
d.erase(index,1);
l=d.size();
for(int i=0;i<l;i++) a[i+1]=d[i]-'0';
for(int i=1;i<=n;i++){
func();
}
if(a[index]>=5){
a[index+1]++;
}
for(int i=index+1;i<=l;i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
if(a[l+1]) l++;
for(int i=l;i>index;i--)
cout<<a[i];
return 0;
}