蓝桥杯真题——好数、R格式

发布于:2025-04-09 ⋅ 阅读:(40) ⋅ 点赞:(0)

目录

蓝桥杯2024年第十五届省赛真题-好数  【模拟题】

题目描述

输入格式

输出格式

样例输入

样例输出

提示

代码1:有两个案例过不了,超时

蓝桥杯2024年第十五届省赛真题-R 格式 【vector容器的使用】

题目描述

输入格式

输出格式

样例输入

样例输出

提示

代码:看博主题解写的,不知道为什么输不出结果

参考代码:


蓝桥杯2024年第十五届省赛真题-好数  【模拟题】

题目描述

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称之为“好数”。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。

输入格式

一个整数 N。

输出格式

一个整数代表答案。

样例输入

24

样例输出

7

提示

对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。试题 C: 好数 4第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组【评测用例规模与约定】对于 10% 的评测用例,1 ≤ N ≤ 100。对于 100% 的评测用例,1 ≤ N ≤ 107。

代码1:有两个案例过不了,超时

#include<bits/stdc++.h>

using namespace std;

int n;
int ans;

bool check(string s)
{
	for(int i=s.size()-1,j=1;i>=0;i--,j++)
	{
		if((j%2!=0&&s[i]%2==0)||(j%2==0&&s[i]%2!=0)) return false;
	}
	return true;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string s=to_string(i);
		if(check(s))
			ans++;
	}
	cout<<ans<<endl;
	
	return 0;
 } 

蓝桥杯2024年第十五届省赛真题-R 格式 【vector容器的使用】

题目描述

小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法是:

1. 将浮点数乘以 2n;

2. 四舍五入到最接近的整数。

输入格式

一行输入一个整数 n 和一个浮点数 d,分别表示转换参数,和待转换的浮点数。

输出格式

输出一行表示答案:d 用 R 格式表示出来的值。

样例输入

2 3.14

样例输出

13

提示

【样例说明】

3.14 × 22 = 12.56,四舍五入后为 13。

【评测用例规模与约定】

对于 50% 的评测用例:1 ≤ n ≤ 10,1 ≤ 将 d 视为字符串时的长度 ≤ 15。

对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度≤ 1024;保证 d 是小数,即包含小数点。

易错点:由于有小数点的存在,只能将浮点数以字符串的形式输入

代码:看博主题解写的,不知道为什么输不出结果

#include<bits/stdc++.h>
//#define int long long
using namespace std;

int n;
string s;

void multi(string s,int n)
{
	int dotpos=s.find('.');//小数点的位置,为了删去小数点 
	int del=s.size()-dotpos-1;//小数部分的长度,为了后面能通过小数点的个数重新计算小数点位置 
	s.erase(dotpos,1);//移除小数点,为后面的乘法计算做准备
	
	vector<int> digits;
	for(auto c:s)//将字符串转换为整型数组 
	{
		digits.push_back(c-'0');
	}
	
	//以
	for(int i=0;i<n;i++)
	{
		int carry=0;//进位值
		for(int j=digits.size()-1;j>=0;j++)//每一位都要乘2 
		{
			int tmp=digits[j]*2+carry;//当前位的计算加上低位的进位值 
			digits[j]=tmp%10;//当前位的计算值 
			carry=tmp/10;//向高位的进位值,当前位大于10时进1 
		 }
		 if(carry>0)
			digits.insert(digits.begin(),carry);
			//如果当前还有进位值,就是新的最高位 
	 } 
	//计算新的小数点的位置:根据乘法规则可知乘法不改变原来的小数点数
	//由于在前面的乘法运算中可能会改变整数的位数,所以要重新计算小数点的位置
	//这里计算小数点的位置是为了后面的四舍五入
	int newDotp=digits.size()-(del);
	
	//如果新的小数点数位置小于等于0,则需要在前面添0
	//结果是10^-k次方,插入前导0,如123 -->0.00123
	if(newDotp<=0)
	{
		digits.insert(digits.begin(),-newDotp+1,0); 
		newDotp=1; 
	}
	
	//四舍五入
	//注意判断新小数点的位置,防止越界 
	if(newDotp<digits.size()) 
	{
		//此时的数组中是不存在小数点的
		//而且此时小数点的位置一定是小数点后第一位的数字 
		if(digits[newDotp]>=5)
		{
			//从小数点前第一个数开始向左进位 
			int i=newDotp-1;//小数点前的第一个数
			while(i>=0)
			{
				if(digits[i]<9)
				{
					digits[i]++;
					break; 
				}
				else
				{
					digits[i]=0;
					i--;
				}
			}
			//注意特判,即当所有数都是9,就会一直前进导致i<0
			//则需要在最前面加1
			if(i<0)
			{
				digits.insert(digits.begin(),1);
				newDotp++;//小数点位置同步更新
				//因为在前面加1相当于把所有的数字都想后移1位,此时记录的小数点位置也要后移
				//用于后面将小数点后的数删去 
			 } 
		}
	}
		//舍弃小数部分
	if(newDotp<digits.size())
		digits.resize(newDotp); 
 
	for(auto c:digits)
	{	
		cout<<c;
	}	
	cout<<endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>n;
	cin>>s;

	multi(s,n);
	return 0;
}

参考代码: