目录
蓝桥杯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;
}