蓝桥杯C++笔记

编程基础通关1-模拟

  1. 成绩统计 (2020年C/C++语言大学B组F题、C组F题)
    [问题描述]
    小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
    如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。
    请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
    [输入格式]
    输入的第一行包含一个整数n,表示考试人数。
    接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
    [输出格式]
    输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
    [样例输入]
    7
    80
    92
    56
    74
    88
    100
    0
    [输入格式]
    71%
    43%
    [评测用例规模与约定]
    对于50%的评测用例,1≤n≤100。 对于所有评测用例,1≤n≤10000。
    [源代码]
#include<bits/stdc++.h>  
	using namespace std;
	int main()
	{
		int n,x,cnt1=0,cnt2=0;
		cin>>n;
		for(int i=1;i<=n;i++)  
		{
			cin>>x;
			if(x>=60) cnt1++;
			if(x>=85) cnt2=cnt2+1;
		}
	cout<<setprecision(0)<<fixed<<(1.0*cnt1/n*100)<<"%\n"<<(1.0*cnt2/n*100)<<"%\n";	}

[思考]
1.iostream和bits/stdc++.h有什么区别?
iostream是一个头文件,允许您使用输入(cin)和输出(cout)。
bits/stdc++.h基本上是一种导入每个C++头文件的方法。
本题中因为setprecision函数的存在,需使用bits/stdc++.h。
2. setprecision(n)是什么意思?fixed呢?
setprecision(n)可控制输出流显示浮点数的数字个数。通常fixed合用,可以控制小数点右边的数字个数。fixed定点数记数法,不使用它的话就会四舍五入计算。
2. 成绩分析 (2020年C/C++语言大学A组F题)
[问题描述]
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0 到100 的整数。
请计算这次考试的最高分、最低分和平均分。
[输入格式]
输入的第一行包含一个整数n,表示考试人数。接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
[输入格式]
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留
正好两位小数,表示平均分。
[样例输入]
7
80
92
56
74
88
99
10
[样例输出]
99
10
71.29
[评测用例规模与约定]
对于 50% 的评测用例,1≤n≤100。 对于所有评测用例,1≤n≤10000。
[源代码]

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;// const是一个C语言的关键字,限定一个变量不允许被改变
int main()
{
	int n,sum,max,min,a[N];
	double avg;
	sum=0;max=0;min=100;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i]; sum+=a[i];
		if(a[i]>max) max=a[i];
		if(a[i]<min) min=a[i];
	}
	cout<<max<<endl;
	cout<<min<<endl;
	avg=1.0*sum/n;
	avg=round(avg*100)/100;
	printf("%.2lf\n",avg);
	return 0;
 }

[思考]
const什么意思?
const是一个C语言的关键字,限定一个变量不允许被改变。
round函数
四舍五入
3. 九进制转十进制 (2022年C/C++语言大学B组A题)
[问题描述]
九进制正整数(2022) 转换成十进制等于多少?这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
[源代码]

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s="2022";
	int ans=0;
	for(int i=0;i<s.size();i++) 
	{
		ans=ans*9+s[i]-'0';// -'0'后代表自身所表示的数
	 } 
	 cout<<ans<<endl;
	 return 0;
}

[思考]
size()什么意思?
取字符串长度,本题为4。
2.为什么要-‘0’?
-'0’后代表自身所表示的数
4. 跑步锻炼
5. 刷题统计
6. 既约分数 (2020年A组B题、B组B题)
[问题描述]
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数
例如3/4,5/2,1/8,7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数,包括1和2020?
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
[源代码]

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int ans=0;
	for(int i=1;i<=2020;i++)
	{
		for(int j=1;j<=2020;j++)
		{
    		if(__gcd(i,j)==1) ans++;
		}
	}
	cout<<ans<<'\n'; 
	return 0;
}

[思考]
1.__gcd(i,j)是什么意思?
__gcd(i,j)是求i与j的公约数。需要注意的是函数前为双下划线
7. 纸张尺寸 (2022年C/C++语言大学C组E )
[问题描述]
在ISO 国际标准中定义了AO 纸张的大小为1189mm x 841mm。
将A0 纸沿长边对折后为A1 纸,大小为841mm x 594mm。
在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。
将A1 纸沿长边对折后为A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。
[输入格式]
输入一行包含一个字符串表示纸张的名称。该名称一定是A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一
[输出格式]
输出两行,每行包含一个整数,依次表示长边和短边的长度。
[样例1输入]
A0
[样例1输出]
1189
841
[样例2输入]
A1
[样例2输出]
841
594
[源代码]

#include <bits/stdc++.h>
using namespace std;
int main(){
	char c;int x;
	cin>>c>>x;
	int a=1189,b=841;
	while(x--){
		a/=2;
		if(a<b) swap(a,b);
	}
	cout<<a<<endl;
	cout<<b<<endl;
	return 0;
}
  1. 排列字母 (2022年C/C+ +语言大学C组C题 )
    [问题描述]
    小蓝要把一个字符串中的字母按其在字母表中的顺序排列。例如,LANQIAO 排列后为AAILNOQ
    又如,GOODGOODSTUDYDAYDAYUP 排列后为AADDDDDGGOOOOPSTUUYYY请问对于以下字符串,排列之后字符串是什么?WHERETHEREISAWILLTHEREISAWAY本题的结果为一个由大写字母组成的字符串,在提交答案时只输出这个字符串,输出多余容将无法得分。
    [源代码]
#include <bits/stdc++.h>
using namespace std;
int main(){
	string s="WHERETHEREISAWILLTHEREISAWAY";
	sort(s.begin(),s.end());
	cout<<s<<endl;
	return 0;
}
  1. 数位排序 (2022年C/C++语言大学C组F题)
    [问题描述]
    小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面例如,2022 排在 409 前面,因为2022 的数位之和是6,小于 409 的数位之和13。又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022给定正整数n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
    [输入格式]
    输入第一行包含一个正整数n。
    第二行包含一个正整数m。
    对于 30%的评测用例, 1≤m≤n≤300 。
    对于 50%的评测用例, 1≤m≤n≤1000 。
    对于所有评测用例, 1≤m≤n≤106 。
    [输出格式]
    输出一行包含一个整数,表示答案
    [样例输入]
    13
    [输入格式]
    3
    [数据范围与提示]
    1到13的排序为: 1,10,2,11,3,12,4,13, 5,6,7,8,9。第5个数为3。
    [解题]
    n=13 m=5,1到13的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,9.第5个数为3。对于数字1~n而言,先求出每个数字的数位之和。再根据数位之和、数本身来自定义排序函数。在排序函数cmp中,优先以数位之和进行排序,小的在前,大的在后,对相同的数位和,则根据数字本身的大小进行排序,也是从小到大排。
    [源代码]
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn],b[maxn];
bool cmp(int x,int y){
  return b[x]<b[y]||b[x]==b[y]&&x<y;
}
int main(){
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    int num=i;
    while(num){
      b[i]+=num%10;
      num/=10;
    }
  a[i]=i;
}
  sort(a+1,a+1+n,cmp);
  cout<<a[m]<<endl;
  return 0;
}

[思考]

  1. sort()函数如何使用?
    sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认从小到大进行排序。
    cmp自定义排序准则
      sort()函数可以自定义排序准则,以便满足不同的排序情况。使用sort()我们不仅仅可以从大到小排或者从小到大排,还可以按照一定的准则进行排序。比如说我们按照每个数的个位进行从大到小排序,我们就可以根据自己的需求来写一个函数作为排序的准则传入到sort()中。
    我们可以将这个函数定义为:
    bool cmp(int x,int y){
    return x % 10 > y % 10;
    }
    然后我们将这个cmp函数作为参数传入sort()中即可实现了上述排序需求。

  2. 数字反转
    [题目描述]
    给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见实例 2)。
    [输入描述]
    输入共 1 行,一个整数N,−109≤N≤109。
    [输出描述]
    输出共 1 行,一个整数,表示反转后的新数。
    [输入输出样例]
    [示例 1]
    输入123
    输出321
    [示例 2]
    输入-380
    输出-83
    [源代码]

#include <bits/stdc++.h>
using namespace std;
char s[100];
int main()
{
  int n;
  cin>>n;
  if (n < 0) {
        printf("-");
        n = -n;
    }
    if (n == 0) {
        printf("0\n");
        return 0;
    }
  sprintf (s,"%d",n);
  int m=strlen(s);
  int i=m-1;
  
  while(s[i]=='0')
  i--;
  
  for(;i>=0;i--)
  printf("%c",s[i]);
  return 0;
}

[思考]

  1. sprintf函数的用法是什么?
    1、该函数包含在stdio.h的头文件中。
    2、sprintf与常用的printf函数的功能很相似。sprintf函数打印到字符串中(要注意的是字符串的长度要足够容纳打印的内容,否则会出现内存溢出),而printf函数打印输出到屏幕上。

  2. strlen 函数的用法是什么?
    strlen 函数用来求字符串的长度(包含多少个字符)。
    strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。
    最终统计的字符串长度不包括\0。

  3. ISBN号码
    [题目描述]
    每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如 “x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4 就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 0 代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如 670 代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
    识别码的计算方法如下:
    首位数字乘以 1 加上次位数字乘以 2 …… 以此类推,用所得的结果 mod 11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例如 ISBN 号码 0-670-82162-4 中的识别码 4 是这样得到的:对 067082162这9 个数字,从左至右,分别乘以 1,2,…,9,再求和,即 0×1+6×2+……+2×9=158,然后取 158 mod 11 的结果 4 作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。
    [输入描述]
    输入一行,是一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。
    [输出描述]
    输出一行,假如输入的 ISBN 号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符“-”)。
    [输入输出样例]
    [示例 1]
    输入
    0-670-82162-4

输出
Right

[示例 2]
输入
0-670-82162-0
输出
0-670-82162-4
[源代码]

#include <bits/stdc++.h>
using namespace std;
char s[100];
int main()
{
  cin>>s;
  int n=strlen(s);
  int chk=0,k=0;
  for(int i=0;i<n-1;i++){
    if(s[i]=='-') continue;
    k++;
    chk+=(s[i]-'0')*k;
  }
  chk%=11;
  char ch;
	if(chk==10)
	ch='X';
    else ch=chk+'0';
    if(ch==s[n-1]){
    	cout<<"Right\n"<<endl;
	}
  else{
  	 s[n-1]=ch;
  	 puts(s);
  }
}

[思考]
puts() 函数
前面在输出字符串时都使用printf,通过“%s”输出字符串。其实还有更简单的方法,就是使用 puts() 函数。该函数的原型为:
int puts(const char *s);
这个函数也很简单,只有一个参数。s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量。功能是将字符串输出到屏幕。输出时只有遇到 ‘\0’ 也就是字符串结束标志符才会停止。

  1. 天干地支
    [题目描述]
    古代中国使用天干地支来记录当前的年份。
    天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
    地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、 亥(hài)。
    将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。
    20202020 年是庚子年。
    每过一年,天干和地支都会移动到下一个。例如 20212021 年是辛丑年。
    每过 6060 年,天干会循环 66 轮,地支会循环 55 轮,所以天干地支纪年每 6060 年轮回一次。例如 19001900 年,19601960 年,20202020 年都是庚子年。
    给定一个公元纪年的年份,请输出这一年的天干地支年份。
    [输入描述]
    输入一行包含一个正整数,表示公元年份。
    其中有 ,输入的公元年份为不超过 99999999 的正整数。
    [输出描述]
    输入一行包含一个正整数,表示公元年份。
    [输入输出样例]
    输入
    2020
    输出
    gengzi
    [源代码]
#include <bits/stdc++.h>
using namespace std;

char tian[][5] = {"jia", "yi",   "bing", "ding", "wu","ji",  "geng", "xin",  "ren",  "gui"};
char di[][5] = {"zi", "chou", "yin",  "mao", "chen", "si","wu", "wei",  "shen", "you", "xu",   "hai"};

int main(){
  int yy;
  cin>>yy;
  int base=2020;
  int tt=6,dd=0;
  
  int dlt=yy-base;
  tt=(tt+dlt)%10;
  dd=(dd+dlt)%12;
//若为负数,则纠正
  tt=(tt+10)%10;
  dd=(dd+12)%12;
  cout<<tian[tt]<<di[dd];
  }

[思考]
char numbers[9][6] = { “one”, “two”, “three”, “four”, “five”, “six”, “seven”, “eight”, “nine” };
它所做的是声明一个包含 9 个元素的二维数组,每个元素包含 6 个字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值