R格式 | 第十五届蓝桥杯C++B组

小蓝最近在研究一种浮点数的表示方法:RR 格式。

对于一个大于 00 的浮点数 dd,可以用 RR 格式的整数来表示。

给定一个转换参数 nn,将浮点数转换为 RR 格式整数的做法是:

  1. 将浮点数乘以 2n2n;
  2. 四舍五入到最接近的整数。
输入格式

一行输入一个整数 nn 和一个浮点数 dd,分别表示转换参数,和待转换的浮点数。

输出格式

输出一行表示答案:dd 用 RR 格式表示出来的值。

数据范围

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

对于 50%50% 的评测用例:1≤n≤101≤n≤10,1≤l≤151≤l≤15。

对于 100%100% 的评测用例:1≤n≤10001≤n≤1000,1≤l≤10241≤l≤1024;保证 dd 是小数,即包含小数点。

输入样例:
复制代码
2 3.14
输出样例:
复制代码
13
样例解释

3.14×22=12.563.14×22=12.56,四舍五入后为 1313。

题解:

本来看到1024位数和1000次方,就以为是有什么小技巧在里面,但是,什么都没有发现。

计算了一下,1024*1000才不过7次级,就是一道普通的高精度运算题,使用字符串。

普通地每一位乘2,大于十就进位。

在四舍五入的时候要注意一下,是否前面有9,是否有很多9,是否要字符串长度加一,比如999.75四舍五入是1000,这个1要处理,其他就没了。

代码:
cpp 复制代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<map>
#include<set>
using namespace std;
typedef long long int ll;

int n;
string s;

string ride(string s){
    string a;
    bool pl=false;
    for(int i=s.size()-1;i>=0;i--){
        if(s[i]=='.'){
            a='.'+a;
        }
        else{
            //cout << "s[i]: " << s[i] << "\n";
            int t=(s[i]-48)*2;
            char ch=(t%10)+48;
            a=ch+a;
            if(pl){
                a[0]++;
                pl=false;
            }
            if(t>=10){
                if(i==0){
                    a='1'+a;
                }
                pl=true;
            }
            //cout << a << "\n";

        }
    }
    //cout << a << "\n";
    return a;

}

int main(){
    cin >> n;
    cin >> s;
    for(int i=0;i<n;i++){
        string a=ride(s);
        s=a;
    }
    //cout << s << "\n";
    for(int i=0;i<s.size();i++){
        if(s[i]=='.'){
            if((s[i+1]-48)>=5){
                int t=i-1;
                bool x=false;
                while(s[t]=='9'){
                    s[t]='0';
                    t--;
                    if(t == -1){
                        cout << '1';
                        x=true;
                        break;
                    }
                }
                if(!x){
                    s[t]++;
                }

                for(int j=0;j<i;j++){
                    cout << s[j];
                }
            }
            else{
                for(int j=0;j<i;j++){
                    cout << s[j];
                }
            }
        }
    }
}
相关推荐
2301_818419017 小时前
C++中的解释器模式变体
开发语言·c++·算法
爱学习的大牛1237 小时前
windows tcpview 类似功能 c++
c++
biter down7 小时前
C++11 统一列表初始化+std::initializer_list
开发语言·c++
ShineWinsu8 小时前
爬虫对抗:ZLibrary反爬机制实战分析技术文章大纲
c++
charlie1145141919 小时前
通用GUI编程技术——Win32 原生编程实战(十六)——Visual Studio 资源编辑器使用指南
开发语言·c++·ide·学习·gui·visual studio·win32
DpHard10 小时前
现代 C++ 中 push 接口为何提供 const T& 与 T&& 两个重载
c++
敲代码的嘎仔11 小时前
Java后端开发——真实面试汇总(持续更新)
java·开发语言·程序人生·面试·职场和发展·八股
U-52184F6911 小时前
深度解析:从 Qt 的 Q_D 宏说起,C++ 工业级 SDK 是如何保证 ABI 稳定性的
数据库·c++·qt
迈巴赫车主11 小时前
蓝桥杯20560逃离高塔
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
hz_zhangrl12 小时前
CCF-GESP 等级考试 2026年3月认证C++三级真题解析
c++·算法·程序设计·gesp·gesp2026年3月·gesp c++三级