C语言四级题库35题
数组部分
1、与指定数字相同的数的个数(2021真题)
输出一个整数序列中与指定数字相同的数的个数。
输入:输入包含三行:
第一行为N,表示整数序列的长度(N ≤ 100);
第二行为N个整数,整数之间以一个空格分开;
第三行包含一个整数,为指定的数字m。
输出
输出为N个数中与m相同的数的个数。
输入样例
3
2 3 2
2
输出样例
2
##include<iostream>
using namespace std;
int main() {
int i,n,m,count=0;
cin>>n;//共有n个数
int a[n+1];//动态生成数组从 下标为1位置存储
for(i=1; i<=n; i++)
cin>>a[i];//读入n个数
cin>>m;//读取第三行指定数m
for(i=1; i<=n; i++) //对数据逐个进行比较
if(a[i]==m) count++;//若与指定数字相同,计数器+1
cout<<count;
return 0;
}
2、陶陶摘苹果
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入
包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出
包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
输入样例
100 200 150 140 129 134 167 198 200 111
110
输出样例
5
#include<iostream>
using namespace std;
int main() {
int a[10],h,count=0;
int i;
for(i=0; i<10; i++)
cin>>a[i]; //输入苹果高度
cin>>h;//输入伸直手的高度
h=h+30;//踩上板凳后的高度
for(i=0; i<10; i++) //对每个苹果进行比较
if(a[i]<=h)//如果苹果高度<能够到的高度
count++;//计数器+1
cout<<count;
return 0;
}
3、计算书费
下面是一个图书的单价表:
计算概论 28.9元/本
数据结构与算法 32.7元/本
数字逻辑 45.6元/本
C++程序设计教程 78元/本
人工智能 35 元/本
计算机体系结构 86.2元/本
编译原理 27.8元/本
操作系统 43元/本
计算机网络 56元/本
JAVA程序设计 65元/本
给定每种图书购买的数量,编程计算应付的总费用。
输入:输入一行,包含10个整数(大于等于0,小于等于100),分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》的数量(以本为单位)。每两个整数用一个空格分开。
输出:输出一行,包含一个浮点数f,表示应付的总费用。精确到小数点后一位。
输入样例
1 5 8 10 5 1 1 2 3 4
输出样例
2410.2
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
double price[10]= {28.9,32.7,45.6,78,35,86.2,27.8,43,56,65};
int num[10];
double sum=0;
int i;
for(i=0; i<10; i++) {
cin>>num[i];
sum+=num[i]*price[i];//累加每种书的价格
}
printf("%.1f",sum);//保留1位小数输出
return 0;
}
4、数组逆序重存放
将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。
输入
输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两个整数之间用空格分隔。
输出
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。
输入样例
5
8 6 5 4 1
输出样例
1 4 5 6 8
#include<iostream>
using namespace std;
int main() {
int n,i;
cin>>n;
int num[n+1];
for(i=1; i<=n; i++)
cin>>num[i];
for(i=n; i>=1; i--) //倒序输出
cout<<num[i]<<" ";
return 0;
}
5、校门外的树
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
第一行有两个整数L(1 ≤ L ≤ 10000)和 M(1 ≤ M ≤ 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
输入样例
500 3
150 300
100 200
470 471
输出样例
298
#include<iostream>
using namespace std;
int main()
{
int L,M,i,j;
int s[10001]= {0};
int a,b,sum=0,ex,new;
cin>>L>>M;//输入马路长度与区域数目
for (i=0; i<M; i++)
{
cin>>a>>b;//输入起始点与终止点
for(j=a; j<=b; j++) //令范围内的树移走
s[j]=1;
}
for(i=0; i<=L; i++) //统计马路长度内被移走的树的数目
if(s[i]==1)
sum++;
ex=L+1;
new=ex-sum;//移走后的树的数目
cout<<new;
return 0;
}
6、开关灯
假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。
第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
输入:输入正整数N和M,以单个空格隔开。
输出:顺次输出关闭的灯的编号,其间用逗号间隔。
输入样例
10 10
输出样例
1,4,9
#include<iostream>
#include<cstring>
using namespace std;
int main() {
int n,m,i,j;
int flag=1;
cin>>n>>m;
bool a[n+1];
memset(a,0,sizeof(a));//初始化为0将灯关上 固定格式
for(i=1; i<=m; i++) //m个人依次进行操作
for(j=1; j<=n; j++) //对n盏灯进行操作
if(j%i==0)//只对人编号的倍数进行操作
a[j]=!a[j];//对灯进行相反处理
for(i=1; i<=n; i++) { //输出灯是关闭的序号
if(a[i]) {
if(flag)
flag=0;//仅第一次不用先输出逗号
else
cout<<",";
cout<<i;
}
}
return 0;
}