编程基础通关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;
}
- 排列字母 (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;
}
- 数位排序 (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;
}
[思考]
-
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)。
[输入描述]
输入共 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;
}
[思考]
-
sprintf函数的用法是什么?
1、该函数包含在stdio.h的头文件中。
2、sprintf与常用的printf函数的功能很相似。sprintf函数打印到字符串中(要注意的是字符串的长度要足够容纳打印的内容,否则会出现内存溢出),而printf函数打印输出到屏幕上。 -
strlen 函数的用法是什么?
strlen 函数用来求字符串的长度(包含多少个字符)。
strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。
最终统计的字符串长度不包括\0。 -
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’ 也就是字符串结束标志符才会停止。
- 天干地支
[题目描述]
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(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 个字符。