//本文章创立初衷是想帮助和我一样C++基础比较薄弱且想考蓝桥杯的同学,若对文中代码有疑议或者问题欢迎提出探讨,本文章会一直更新。共勉!
1.小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入一行包含三个整数a,b 和n.
输出一个整数代表天数
#include<bits/stdc++.h>
using namespace std;
long long a,b,n;
long long weekday=0,day=0;
int main()
{
cin>>a>>b>>n;
while(n>0){
if(weekday<5)/*判断是否小于周五*/
{
n-=a;/*做了a道题n减少a道题*/
}
else{
n-=b;/*大于周五则做b道题,做了b道n整体减少b道*/
}
weekday++;/*周几加一*/
weekday=weekday%7;/*防止出现星期八*/
day++;/*做题天数加一*/
}
cout<<day;
return 0;
}
2.小蓝发现,对于一个正整数n 和一个小于n 的正整数v,将v 平方后对n 取余可能小于n 的一半,也可能大于等于n 的一半。请问,在1到n−1 中, 有多少个数平方后除以n 的余数小于n 的一半。例如,当n=4 时,1,2,3的平方除以4的余数都小于4的一半。又如,当n=5 时, 1,4 的平方除以 5的余数都是1,小于5 的一半。而 2,3的平方除以 5的余数都是4, 大于等于5的一半。
输入一行包含一个整数n
输出一个整数,表示满足条件的数的数量
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n,a,i=1,count=0;
cin>>n;
for(ll i=1;i<=n-1;i++)
{
a=i*i%n;
if(a<(n/2.0))
{
count++;
}
}
cout<<count;
return 0;
}
3.今年是 2021 年,2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大1,我们称满足这样条件的年份为特殊年份。输入5个年份,请计算这里面有多少个特殊年份。
输入5行,每行一个4位十进制数(数值范围为1000 至9999),表示一个年份。
输出一个整数,表示输入的 55 个年份中有多少个特殊年份
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll count=0;
ll year;
ll a[100000];
for(ll i=0;i<5;i++)
{
cin>>year;
if(year>=1000&&year<=9999)
{
a[i]=year;
if(i>=5)
{
break;
}
if((a[i]/1000==a[i]/10%10)&&(a[i]%10-a[i]/100%10==1))
{
count++;
}
}
}
cout<<count;
return 0;
}
4.小蓝要处理非常多的数据, 其中有一些数据是日期,在小蓝处理的日期中有两种常用的形式:英文形式和数字形式,英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写, 日期小于10 时要补前导 0。11 月到12月英文的前三个字母分别是 Jan
、Feb
、Mar
、Apr
、May
、Jun
、Jul
、Aug
、Sep
、Oct
、Nov
、Dec
。数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 0
。其中月份用1至12分别表示1月到12月。输入一个日期的英文形式, 请输出它的数字形式。
输入一个日期的英文形式
输出一行包含两个整数,分别表示日期的月和日
/*输入用cin,输出用printf节省时间*/
#include<bits/stdc++.h>
#define ll long long;
using namespace std;
/*Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec*/
int main()
{
string s;
cin >> s;
int month=0,day=0;
if(s[0]=='J'){
if(s[1]=='a')
{
month=1;
}
else if(s[2]=='n'){
month=6;
}
else{
month=7;
}
}
if(s[0]=='F'){
month=2;
}
if(s[0]=='M'){
if(s[2]=='r')
{
month=3;
}
else{
month=5;
}
}
if(s[0]=='A'){
if(s[1]=='p')
{
month=4;
}
else{
month=8;
}
}
if(s[0]=='S')
{
month=9;
}
if(s[0]=='O')
{
month=10;
}
if(s[0]=='N')
{
month=11;
}
if(s[0]=='D')
{
month=12;
}
day=((s[3]-'0')*10)+(s[4]-'0');
printf("%d %d",month,day);
}
5.小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数,请计算这次考试的最高分、最低分和平均分。
输入的第一行包含一个整数n,表示考试人数,接下来n 行,每行包含一个0至100的整数,表示一个学生的得分。
输出三行,第一行包含一个整数,表示最高分,第二行包含一个整数,表示最低分,第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
#include<bits/stdc++.h>
#define ll long long;
using namespace std;
int main()
{
int n,a;
float sum;
cin>>n;
int maxi=-1,mini=101;
float ave;
for(int i=0;i<n;i++)
{
cin>>a;
sum+=a;
maxi=max(a,maxi);
mini=min(a,mini);
}
ave=sum*1.0/n;
/*sort(a,a+n);/*sort(a,a+n):n表示排序多少个,结果是从小到大,此处不用因为复杂化,直接用max,min函数更快*/
printf("%d\n",maxi);
printf("%d\n",mini);
printf("%.2f\n",ave);
return 0;
}
6.有一个序列,序列的第一个数是n,后面的每个数是前一个数整除2,请输出这个序列中值为正数的项。
输入一行包含一个整数n
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n,a;
cin >> n;
while(n>=1&&a!=0)
{
a=n;
n=n/2;
cout<<a<<" ";
}
return 0;
}
7.小明有一串很长的英文字母,可能包含大写和小写。在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。例如,连续的5个 a
,即 aaaaa
,小明可以简写成 a5
(也可能简写成 a4a
、aa3a
等)。对于这个例子:HHHellllloo
,小明可以简写成 H3el5o2
。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。现在给出简写后的字符串,请帮助小明还原成原来的串。
输入一行包含一个字符串。
输出一个字符串,表示还原后的串。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
string s;
cin>>s;
ll n=s.size(); //.size()函数可以计算字符串有效长度
for(ll i=0;i<n;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
for(ll j=1;j<(s[i]-'0');j++) //一个数字型字符减去'0'等于相同大小数字, 字符型则
是Ascll码;这里j从1开始是因为第一个如果是字符的话则已经输出一次了
{
cout<<s[i-1];
}
}
else{
cout<<s[i];
}
}
return 0;
}
8.小明对数位中含有 2、0、1、9的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2、9、10 至 32、39 和 40,共 28个,他们的和是 574。请在1到n中,所有这样的数的和是多少?
输入一行包含一个整数n。
输出一行,包含一个整数,表示满足条件的数的和。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n;
cin>>n;
ll i,a;
ll sum=0;//sum必须赋初值否则电脑会自动分配数值
for(i=1;i<=n;i++)
{
a=i;
while(a!=0)
{
if(a%10==2||a%10==0||a%10==1||a%10==9)//任何数只要一直对10取余数就能获得每个数位上的值
{
sum+=i;//满足条件的数值进行加法,不能加a是因为判断每个数位上的数字后续需要除10,改变了原来数值大小
break;//满足条件加完就退出否则判断成立一次就卡在这里一直加
}
a=a/10;//让a缩小10倍,方便后续取更大数位上的余数
}
}
cout<<sum;
return 0;
}
9.每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。你的任务是通过编程,找出断号的 ID 和重号的 ID,数据保证断号不可能发生在最大和最小号。
一个整数 N(N<100)表示后面数据行数,接着读入N 行数据,每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于 10^5),每个整数代表一个 ID 号。
/*本题思路把除行数之外的输入数据以字符串形式输入,
然后用stringstream定义字符串流进行字符和数字类型转换
且stringstream会在字符串结束时停止读入,因为本题cin和getline混用所以需要使用
cin.ignore(numeric_limits<streamsize>::max(),'\n');
来提取第一个换行符并且把流指针放到下一行。
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10000],q;//不超过100行,每行不超过100个,最多10000个数字
int N,m,n,i;
string s;
cin>>N;
cin.ignore(numeric_limits<streamsize>::max(),'\n');//取出输入N后的换行符,让流指针指向下一行
for(i=1;i<=N;i++)
{
getline(cin,s); //读取每行字符串并放到s中
stringstream si(s); //把字符型数字转换成数字型并放入si中
while(si>>a[++q]); //si的数字传到a[i]数组中,q记录一共多少个数
}
sort(a+1,a+q+1); //所有数字从小到大排序
for(i=2;i<=q;i++)
{
if(a[i]==a[i+1]-2) m=a[i]+1;//缺少
else if(a[i]==a[i+1]) n=a[i];//重复
printf("%d %d\n",m,n);
}
return 0;
}