蓝桥杯基础练习题(2024年以前)

//本文章创立初衷是想帮助和我一样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月英文的前三个字母分别是 JanFebMarAprMayJunJulAugSepOctNovDec。数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 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(也可能简写成 a4aaa3a 等)。对于这个例子: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;
} 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值