蓝桥杯历届真题--#R格式(C++,Java) 高精度运算

文章目录


题目解读

原题链接

题目描述

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

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

输入格式

一行一个整数 n n n 和一个浮点数 d d d。

输出格式

一行一个整数表示 d d d 用 R R R 格式表示出的值。

样例 1 解释

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

数据规模与约定

用 t t t 表示将 d d d 视为字符串时的长度。

  • 对于 50 % 50\% 50% 的数据,保证 n ≤ 10 n \le 10 n≤10, t ≤ 15 t \le 15 t≤15。
  • 对于全部的测试数据,保证 1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000, 1 ≤ t ≤ 1024 1 \le t \le 1024 1≤t≤1024,保证 d d d 是小数,即包含小数点。

思路

高精度计算即可

完整题解

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

void mul(vector<int>& a, int b) {
    int t = 0;
    for (int i = 0; i < a.size(); i++) {
        t += a[i] * b;
        a[i] = t % 10;
        t /= 10;
    }
    if (t)a.push_back(t);
    while (a.back() == 0 && a.size() > 1)a.pop_back();
}

void add(vector<int>& a, int k, int b) {
    int t = b;
    for (int i = k; i < a.size(); i++) {
        t += a[i];
        a[i] = t % 10;
        t /= 10;
    }
    if (t)a.push_back(t);
}

int main() {
    int n;
    //浮点数d的长度最大1024位,这里用字符串存下
    string d;
    cin >> n >> d;

    vector<int> D;
    reverse(d.begin(), d.end());
    //存储小数点的位置
    int dot = d.find('.');
    for (int i = 0; i < d.size(); i++) {
        if (d[i] != '.')D.push_back(d[i] - '0');
    }


    while (n--)mul(D, 2);
    //找小数点的后一位,看看是不是大于等于5,如果大于等于5那么小数点前一位+1
    //3.14 -> 41.3 反转之后找小数点后一位就是dot-1下标对应的数字
    if (D[dot - 1] >= 5)add(D, dot, 1);

    for (int i = D.size() - 1; i >= dot; i--)cout << D[i];
    return 0;
}
java 复制代码
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

class Main{
    static Scanner sc =new Scanner(System.in);

    public static void main(String args[]) {
        int n=sc.nextInt();
        String d=sc.next();
        BigDecimal dd=new BigDecimal(d);

        //求2的n次方
        BigDecimal num1=new BigDecimal(2).pow(n);
        //2的n次方 乘以 浮点数d
        BigDecimal num2=num1.multiply(dd);
        //设置精度
        BigDecimal ans = num2.setScale(0,RoundingMode.HALF_UP);
        System.out.println(ans);
    }
}

参考

Acwing


🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻

🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹

😇 本篇文章可能存在多处不足,如有修改意见,可以私信或者评论我哦 😇


相关推荐
wqfhenanxc34 分钟前
Mixing C++ and Rust for Fun and Profit 阅读笔记
c++·笔记·rust
R-G-B37 分钟前
【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
c++·mfc·vs打开较早版本mfc·双击.rc文件·dialog加载失败·fatal error rc·cannot open
敲上瘾40 分钟前
基于Tcp协议的应用层协议定制
linux·运维·服务器·网络·c++·网络协议·tcp/ip
莹莹学编程—成长记2 小时前
string的模拟实现
服务器·c++·算法
lybugproducer2 小时前
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
java·设计模式·建造者模式·简单工厂模式·工厂方法模式·抽象工厂模式·面向对象
南客先生2 小时前
马架构的Netty、MQTT、CoAP面试之旅
java·mqtt·面试·netty·coap
Minyy112 小时前
SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常
xml·java·spring boot·后端·spring·mybatis·logback
百锦再2 小时前
Java与Kotlin在Android开发中的全面对比分析
android·java·google·kotlin·app·效率·趋势
武昌库里写JAVA3 小时前
39.剖析无处不在的数据结构
java·vue.js·spring boot·课程设计·宠物管理
喵先生!5 小时前
C++中的vector和list的区别与适用场景
开发语言·c++