目录
蓝桥杯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.00123if(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//则需要在最前面加1if(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;
}