一、题目
题目描述
小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法是:1. 将浮点数乘以 2^n;
2. 四舍五入到最接近的整数。
输入格式
一行输入一个整数 n 和一个浮点数 d,分别表示转换参数,和待转换的浮点数。输出格式
输出一行表示答案:d 用 R 格式表示出来的值。样例输入
2 3.14
样例输出
13
提示
【样例说明】3.14 × 22 = 12.56,四舍五入后为 13。
【评测用例规模与约定】
对于 50% 的评测用例:1 ≤ n ≤ 10,1 ≤ 将 d 视为字符串时的长度 ≤ 15。
对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度≤ 1024;保证 d 是小数,即包含小数点。
二、思路
我的想法很简单,把得到的数的整数部分和小数部分分离,如果小数部分>0.5,就加到整数部分,否则直接输出整数部分。
三、代码
#include<iostream>
#include<cmath>
int main(){
int n;
double d;
std::cin>>n>>d;
long double num = pow(2,n)*d;
int t = num;
double f = num-t;
if(f>0.5){
long long endNum = num + 1;
std::cout<<endNum;
}else{
std::cout<<t;
}
return 0;
}
四、反思
精度范围
- 对于 100% 的评测用例:浮点数 的长度最多为 1024 位。这是一个非常长的数字,远远超出了常规浮点数类型(如 float 或 double)的表示范围。常规的浮点数类型通常只能精确表示 15 到 17 位有效数字(字节的意思)(取决于语言和平台),而 1024 位的数字已经超出了它们的精度范围。
- int 32位 8字节
- long 32或64位 8字节
- long long 32或64位 8字节
- long double 128位 16字节
整型
数据类型 | 通常位数 | 取值范围 |
---|---|---|
bool | 通常 1 位 | true 或 false |
char | 8 位 | 有符号:-128 到 127;无符号:0 到 255 |
signed char | 8 位 | -128 到 127 |
unsigned char | 8 位 | 0 到 255 |
short (即 signed short ) | 16 位 | -32768 到 32767 |
unsigned short | 16 位 | 0 到 65535 |
int (即 signed int ) | 通常 32 位 | -2147483648 到 2147483647 |
unsigned int | 通常 32 位 | 0 到 4294967295 |
long (即 signed long ) | 至少 32 位,在 64 位系统通常为 64 位 | 32 位系统:-2147483648 到 2147483647;64 位系统:-9223372036854775808 到 9223372036854775807 |
unsigned long | 至少 32 位,在 64 位系统通常为 64 位 | 32 位系统:0 到 4294967295;64 位系统:0 到 18446744073709551615 |
long long (即 signed long long ) | 64 位 | -9223372036854775808 到 9223372036854775807 |
unsigned long long | 64 位 | 0 到 18446744073709551615 |
浮点型
数据类型 | 位数 | 取值范围 | 精度 |
---|---|---|---|
float | 32 位 | 大约 ±3.4×10^38 | 6 - 7 位有效数字 |
double | 64 位 | 大约 ±1.7×10^308 | 15 - 16 位有效数字 |
long double | 通常 80 位或 128 位 | 比 double 更大 | 比 double 更高 |
高精度算法
第十五届蓝桥杯C/C++B组题解——R格式_第十五届蓝桥杯c语言b组答案-优快云博客
是一种用于处理超出标准数据类型范围的数值计算的算法。它通过模拟手工计算的方式,使用数组或字符串来存储和操作大整数或高精度小数。以下是使用高精度算法的原因和优势: