IT评测·应用市场-qidao123.com

标题: 蓝桥杯 r格式(高精度*低精度) [打印本页]

作者: 数据人与超自然意识    时间: 2025-2-22 13:02
标题: 蓝桥杯 r格式(高精度*低精度)

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

思绪:起首注意到本题的数字大小很大,需要用到高精度,因此应该定义string来存储数据d,为了后续计算,在存储完字符串d之后还需要先将每一位转化为数字并且找到小数点在第几位,而数据2**n由于直接算出来会超范围,所以我们采取每次将d的每一位乘2 来算即可。
详见注释
  1. #include<bits/stdc++.h>
  2. using namespace std;   
  3. int main()
  4. {
  5.   ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); //降低输入输出流
  6.   int n;
  7.   string d;
  8.   cin>>n>>d;
  9.   vector<int>b;  
  10.   int sum=0,k=0;
  11.   for(int i=d.size()-1;i>=0;i--)//注意这里是倒叙存储入 b 数组,否则后续进位不方便
  12.   {
  13.       if(d[i]!='.')//判断是否是小数点
  14.         b.push_back(d[i]-'0');//把每一个字符转化为数字,方便后续乘法 ,这里如果用数组且下标不做改动的话b[k]会等于0,会对进位等过程有影响,但是我们这里用了vector是直接从后面加入数据的,所以原本小数点的位置现在存储 的就是整数部分的最后一位
  15.       else k=sum;  // 记录下小数点的位置,为了后续四舍五入
  16.       sum++;   
  17.   }
  18.   int u=b.size();
  19.   while(n--) //由于2**n 超出数可以表示的范围,所以想到每次*2  
  20.   {   
  21.     int t=0;
  22.       for(int i=0;i<b.size();i++)
  23.       {
  24.           b[i]=b[i]*2+t;  //t表示进位
  25.           if(b[i]>=10)
  26.           {
  27.               t=b[i]/10;
  28.               b[i]=b[i]%10;
  29.           }
  30.           else t=0;
  31.       }
  32.       if(t)//处理最后一位的进位
  33.         b.push_back(t);
  34.   }   
  35.   u=b.size();
  36.   int t=1;
  37.   if(k&&b[k-1]>=5){   
  38.     for(int i=k;i<u;i++)
  39.        {
  40.            b[i]=b[i]+1;//这里直接加 1 而不是 t 是因为两个个位数相加最终结果是小于20的,所以进位最多为 1
  41.            if(b[i]<=9){t=0;break;}
  42.            else b[i]-=10;
  43.       }
  44.     if(t) b.push_back(t);//如果一直循环到最后t还为1,那么就要最后进位
  45.   }
  46.     for(int i=b.size()-1;i>=k;i--)//倒序输出
  47.       cout<<b[i];
  48.   return 0;
  49. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4