数据人与超自然意识 发表于 2025-2-22 13:02:42

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

https://i-blog.csdnimg.cn/direct/c93071ac38804408a5215a33093331f0.png
输入样例:2 3.14
输出样例:13 https://i-blog.csdnimg.cn/direct/dd8939d66b484083b9bedbd14fb98479.png
思绪:起首注意到本题的数字大小很大,需要用到高精度,因此应该定义string来存储数据d,为了后续计算,在存储完字符串d之后还需要先将每一位转化为数字并且找到小数点在第几位,而数据2**n由于直接算出来会超范围,所以我们采取每次将d的每一位乘2 来算即可。
详见注释
#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!='.')//判断是否是小数点
      b.push_back(d-'0');//把每一个字符转化为数字,方便后续乘法 ,这里如果用数组且下标不做改动的话b会等于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=b*2+t;//t表示进位
          if(b>=10)
          {
            t=b/10;
            b=b%10;
          }
          else t=0;
      }
      if(t)//处理最后一位的进位
      b.push_back(t);
}   
u=b.size();
int t=1;
if(k&&b>=5){   
    for(int i=k;i<u;i++)
       {
         b=b+1;//这里直接加 1 而不是 t 是因为两个个位数相加最终结果是小于20的,所以进位最多为 1
         if(b<=9){t=0;break;}
         else b-=10;
      }
    if(t) b.push_back(t);//如果一直循环到最后t还为1,那么就要最后进位
}
    for(int i=b.size()-1;i>=k;i--)//倒序输出
      cout<<b;
return 0;
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 蓝桥杯 r格式(高精度*低精度)