第15届蓝桥杯试题D: R格式

本文介绍了如何将给定的浮点数按照R格式进行转换,通过乘以2^n并四舍五入到最接近的整数,使用字符串处理方法避免double精度限制,实现大数加法操作。
摘要由CSDN通过智能技术生成

时间限制: 1.0s 内存限制: 256.0MB 本题总分:10分

【问题描述】

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

1. 将浮点数乘以2^n;

2. 四舍五入到最接近的整数。

【输入格式】 一行输入一个整数n和一个浮点数d,分别表示转换参数,和待转换的浮点数。

【输出格式】 输出一行表示答案:d用R格式表示出来的值。

【样例输入】 2 3.14

【样例输出】 13

【样例说明】 3.14 × 2^2 = 12.56,四舍五入后为 13。

【评测用例规模与约定】

对于50%的评测用例:1≤n≤10,1≤将d 视为字符串时的长度≤15。

对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度 ≤ 1024;保证 d 是小数,即包含小数点。

问题分析

因为小数最多1024位,而double类型最多储存16位,n最多1000。所以使用double精度肯定不行。所以使用字符串处理,类似于大数加法。代码如下:

#include<iostream>
#include<string.h>
using namespace std;
string fun(string x)
{
    string s;
    int len=x.size()-1;
    int flag=0;
    while(len>=0||flag>0)
    {    
        if(len>=0&&x[len]=='.')
        s.insert(s.begin(),'.');
        else
        {
            int num=len<0?0:x[len]-'0';
            int sum=2*num+flag;
            flag=sum/10;
            s.insert(s.begin(),sum%10+'0');
        }
        len--;
    }
    return s;
}
int main()
{
    int n;
    string d;
    cin>>n>>d;
    while(n)
    {
        d=fun(d);
        n--;
    }
    for(int i=0;;i++)
    {
        if(d[i]=='.')
        {
            if(d[i+1]>='5')
            d[i-1]++;
            d=d.substr(0,i);
            break;
        }
    }
    cout<<d;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值