【2024蓝桥B组】 R格式
R格式
题目

题目分析
1.看似是x*2n,实际上可以看为x对自身的累加,例如:
x*21=x*2=2x
x*22=(x+x)+(x+x)=4x
x*23=((x+x)+(x+x))+((x+x)+(x+x))=8x
...
所以,我们可以自己调用一个函数:在该函数实现对s自身的累加,由于我们需要进行多次对自身的累加,所以我们采用指针
void add(string& a, string& b)
{
int t = 0;
for (int i = 0; i < a.size(); i++)
{
t += a[i] - '0' + b[i] - '0';//累加自己,将字符串转化为数字
a[i] = t % 10 + '0'; //将数字转化为字符
t /= 10; //进位数字
}
if (t)
{
a.push_back('1');//报头开始
}
}
2.我们需要关注到一个点,由于我们是乘以2n,所以我们的小数点位置不变,所以我们可以直接计算小数点的位置,方便后续的四舍五入
3.答案需要四舍五入,所以,我们需要判断小数点后一位是否需要四舍五入,然后调用add函数
代码
#include<bits/stdc++.h>
using namespace std;
void add(string& a, string& b)
{
int t = 0;
for (int i = 0; i < a.size(); i++)
{
t += a[i] - '0' + b[i] - '0';//累加自己,将字符串转化为数字
a[i] = t % 10 + '0'; //将数字转化为字符
t /= 10; //进位数字
}
if (t)
{
a.push_back('1');//报头开始
}
}
int main()
{
int n;
string d;
cin >> n >> d;
//小数点位置不会改变,我们需要先计算小数点位置
string s;
int pos;
for (int i = d.size() - 1, j = 0; i >= 0; i--)
{
if (d[i] != '.')
{
s.push_back(d[i]);//逆序存储
j++;
}
else
{
pos = j - 1;//小数点后一位位置
}
}
for (int i = 1; i <= n; i++)
{
add(s, s);
}
//四舍五入
if (s[pos] >= '5')
{
string b(s.size(), '0');
b[pos + 1] = '1';
add(s, b);
for (int i = s.size() - 1; i > pos; i--)
{
cout << s[i];
}
}
else
{
for (int i = s.size() - 1; i > pos; i--)
{
cout << s[i];
}
}
return 0;
}

浙公网安备 33010602011771号