蓝桥杯 r格式(高精度*低精度)

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

**思路:**首先注意到本题的数字大小很大,需要用到高精度,因此应该定义string来存储数据d,为了后续计算,在存储完字符串d之后还需要先将每一位转化为数字并且找到小数点在第几位,而数据2**n由于直接算出来会超范围,所以我们采取每次将d的每一位乘2 来算即可。

详见注释

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;   
int main()
{
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); //降低输入输出流 
  int n;
  string d; 
  cin>>n>>d;
  vector<int>b;  
  int sum=0,k=0;
  for(int i=d.size()-1;i>=0;i--)//注意这里是倒叙存储入 b 数组,否则后续进位不方便 
  {
      if(d[i]!='.')//判断是否是小数点 
        b.push_back(d[i]-'0');//把每一个字符转化为数字,方便后续乘法 ,这里如果用数组且下标不做改动的话b[k]会等于0,会对进位等过程有影响,但是我们这里用了vector是直接从后面加入数据的,所以原本小数点的位置现在存储 的就是整数部分的最后一位 
      else k=sum;  // 记录下小数点的位置,为了后续四舍五入 
      sum++;   
  }
  int u=b.size();
  while(n--) //由于2**n 超出数可以表示的范围,所以想到每次*2  
  {    
    int t=0;
      for(int i=0;i<b.size();i++)
      {
          b[i]=b[i]*2+t;  //t表示进位 
          if(b[i]>=10)
          {
              t=b[i]/10;
              b[i]=b[i]%10;
          }
          else t=0;
      }
      if(t)//处理最后一位的进位 
        b.push_back(t);
  }   
  u=b.size();
  int t=1;
  if(k&&b[k-1]>=5){    
    for(int i=k;i<u;i++)
       {
           b[i]=b[i]+1;//这里直接加 1 而不是 t 是因为两个个位数相加最终结果是小于20的,所以进位最多为 1 
           if(b[i]<=9){t=0;break;}
           else b[i]-=10;
      } 
    if(t) b.push_back(t);//如果一直循环到最后t还为1,那么就要最后进位 
  }
    for(int i=b.size()-1;i>=k;i--)//倒序输出 
      cout<<b[i];
  return 0;
}
相关推荐
码客-ygluu3 小时前
一个通用游戏数据服务器
c++·架构
another heaven3 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude3 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司3 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP6 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck6 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀6 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落7 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
旖旎夜光8 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习