【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;
}

  

posted @ 2024-04-17 17:36  山远尽成云  阅读(333)  评论(0)    收藏  举报