image

编辑人: 舍溪插画

calendar2025-12-08

message5

visits734

2023年09月C语言二级答案及解析

一、编程题

1、数组指定部分逆序重放
将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。
时间限制:1000
内存限制:65536
输入
输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n < 100)以及指定的k(1 <= k <= n)。 第二行是n个整数,每两个整数之间用空格分隔。
输出
输出为一行:输出按题目要求逆序后数组的整数,每两个整数之间用空格分隔。
样例输入

5 3
8 6 5 4 1

样例输出

5 6 8 4 1

参考答案:

include<bits/stdc++.h>

using namespace std;

int a[105];

int main()

{

int n,k;

cin>>n>>k;

for (int i=1;i<=n;i++)

{

cin>>a[i];

}

for (int i=k;i>=1;i–)

{

cout<<a[i]<<" ";

}

for (int i=k+1;i<=n;i++)

{

cout<<a[i]<<" ";

}

return 0;

}

解析:【喵呜刷题小喵解析】:首先,我们定义了一个数组`a`,用于存储输入的整数。然后,我们从标准输入读取数组的大小`n`和需要逆序的项数`k`。接下来,我们使用一个循环来读取数组中的每个元素,并将其存储在数组`a`中。然后,我们使用两个循环来输出逆序后的数组。第一个循环从`k-1`开始,向前遍历数组,并将每个元素输出到标准输出。第二个循环从`k`开始,向后遍历数组,并将每个元素输出到标准输出。注意,数组索引从0开始,因此在读取和输出数组元素时,我们需要将索引减1或加1。另外,题目中要求输出逆序后的数组,因此在输出时,我们需要将前`k`个元素逆序输出。在C++中,我们可以使用循环来实现逆序输出,也可以使用`reverse`函数来逆序数组,但在这个问题中,使用循环更为简单和直观。

2、序列排序
对于给定的正整数序列,按照每个数的各位数和从大到小排序,各位数和相同的按照本身大小排序,大的在前,小的在后。
时间限制:1000
内存限制:65536
输入
第一行1个整数n,表示序列的大小。( 0 < n ≤ 1000) 第二行n个正整数,表示序列的每个数,每个数不大于100000000。
输出
输出按照题目要求排序后的序列
样例输入

6
17 26 9 13 88 10 

样例输出

88 9 26 17 13 10

参考答案:

include<bits/stdc++.h>

using namespace std;

struct num{

int a;

int g;

}s[100];

bool cmp(num a,num b){

if(a.g<b.g)

return a.g;

if(a.g>b.g)

return b.g;

if(a.a>b.a)

return b.a;

return a.a;

}

int main()

{

int n;

cin>>n;

for(int i=1;i<=n;i++){

cin>>s[i].a;

s[i].g=s[i].a%10;

}

sort(s+1,s+1+n,cmp);

for(int i=1;i<=n;i++){

cout<<s[i].a<<" ";

}

return 0;

解析:【喵呜刷题小喵解析】:本题要求我们对一个正整数序列进行排序,排序的规则是:先按照每个数的各位数之和从大到小排序,如果各位数之和相同,则按照数字本身的大小排序,大的在前,小的在后。我们可以使用一个结构体来存储每个数字和其各位数之和。然后在比较函数中,我们先比较各位数之和,如果相同,再比较数字本身。最后使用`sort`函数对序列进行排序。在这个程序中,`s`数组用于存储输入的数字和它们的各位数之和,`cmp`函数用于比较两个数字的大小,`main`函数用于读取输入并进行排序和输出。但是,程序中有几个错误:1. `if(a.gb.g)`应该返回`false`,而不是`b.g`。3. `if(a.a>b.a)`应该返回`false`,而不是`b.a`。正确的比较函数应该是这样的:```cppbool cmp(num a,num b){if(a.g>b.g)return true;if(a.gb.a)return false;return true;}```此外,数组下标从1开始是不符合C++编程习惯的,应该从0开始。所以,在读取输入和排序时,应该将下标从1改为0。最后,输出时应该使用`cout<

3、内部元素之和
输入一个整数矩阵,计算位于矩阵内部的元素之和。所谓矩阵内部的元素,不在第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制:1000
内存限制:65536
输入
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数据中,每行包含n个整数(每个数大于等于0,小于1000),整数之间以一个空格分开。
输出
输出对应矩阵的内部元素和
样例输入

3 3
3 4 1
3 7 1
2 0 1

样例输出

7

参考答案:

include<iostream>

using namespace std;

int main(){

int m,n,sum=0;

cin>>m>>n;

int a[m][n];

for(int i=0;i<m;i++){

for(int j=0;j<n;j++){

cin>>a[i][j];

}

}

for(int i=0;i<m;i++){

for(int j=0;j<n;j++){

if(i!=0&&i!=m-1&&j!=0&&j!=n-1)

sum+=a[i][j];

}

}

cout<<sum;

return 0;

}

解析:【喵呜刷题小喵解析】:该题目要求计算一个整数矩阵的内部元素之和,即不在第一行和最后一行的元素以及第一列和最后一列的元素。首先,我们需要读取矩阵的行数m和列数n,然后读取矩阵中的每个元素。接着,我们需要遍历矩阵中的每个元素,如果元素不在第一行和最后一行的元素以及第一列和最后一列的元素,则将其加入到sum中。最后,输出sum即可。在C++中,我们可以使用二维数组来表示矩阵,使用循环来遍历矩阵中的每个元素,使用if语句来判断元素是否满足条件。在上面的代码中,我们使用了cin和cout来读取和输出数据,使用了二维数组a来存储矩阵中的元素,使用了for循环来遍历矩阵中的每个元素,使用了if语句来判断元素是否满足条件,最后输出了sum的值。

4、谁考了第k名
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
时间限制:1000
内存限制:65536
输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。 其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
样例输入

5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9

样例输出

90788004 68.4

参考答案:

include <iostream>

using namespace std;

int id[110];

double s[110];

int main(){

int n,k,it;

double t;

cin>>n>>k;

for(int i=0;i<n;i++) cin>>id[i]>>s[i];

for(int i=0;i<n;i++){

int k=i;

for(int j=i;j<n;j++) if(s[j]<s[k]) k=j;

if(k!=i){

t=s[i];

s[i]=s[k];

s[k]=t;

it=id[i];

id[i]=id[k];

id[k]=it;

}

}

cout<<id[n-k]<<" "<<s[n-k];

return 0;

}

解析:【喵呜刷题小喵解析】:首先,需要读入学生的数量n和需要找的第k名学生的k值。然后,读入每个学生的学号和成绩,分别存储在数组id和score中。接下来,使用冒泡排序算法对学生的成绩进行排序。在排序过程中,如果当前学生的成绩比下一个学生的成绩大,则交换他们的成绩和学号。最后,输出第k名学生的学号和成绩。由于数组下标是从0开始的,所以第k名学生的学号和成绩实际上是存储在数组的第n-k个位置。需要注意的是,题目中要求使用%g输出成绩,但在给出的答案中并没有使用。在实际编程时,应该使用%g格式说明符来输出成绩,以确保输出的成绩格式正确。例如,可以将最后的输出语句改为`cout << id[n - k] << " " << setprecision(2) << fixed << score[n - k];`,其中`setprecision(2)`和`fixed`用于设置输出的小数位数为2位。

5、话题焦点人物
微博提供了一种便捷的交流平台。一条微博中,可以提及其它用户。例如Lee发出一条微博为:“期末考试顺利 @Kim @Neo”,则Lee提及了Kim和Neo两位用户。

我们收集了N(1 < N < 10000)条微博,并已将其中的用户名提取出来,用小于等于100的正整数表示。

通过分析这些数据,我们希望发现大家的话题焦点人物,即被提及最多的人(题目保证这样的人有且只有一个),并找出那些提及它的人。
时间限制:1000
内存限制:65536
输入
输入共两部分: 第一部分是微博数量N,1 < N < 10000。 第二部分是N条微博,每条微博占一行,表示为: 发送者序号a,提及人数k(0 < = k < = 20),然后是k个被提及者序号b1,b2…bk; 其中a和b1,b2…bk均为大于0小于等于100的整数。相邻两个整数之间用单个空格分隔。
输出
输出分两行: 第一行是被提及最多的人的序号; 第二行是提及它的人的序号,从小到大输出,相邻两个数之间用单个空格分隔。同一个序号只输出一次。
样例输入

5
1 2 3 4
1 0
90 3 1 2 4
4 2 3 2
2 1 3

样例输出

3
1 2 4

参考答案:

include <bits/stdc++.h>

using namespace std;

int main()

{

int n;

int m;

cin >> n;

int sender;

int mentioned;

int a[101][101] = { 0 };

for (int i = 0; i < n; i++) {

cin >> sender;//sender表示接下来要发微博的人

cin >> m;//m表示接下来要Q的人数

for (int j = 0; j < m; j++) {

cin >> mentioned;

a[sender][mentioned]++;

}

}

int max = 1;

//max表示被Q到最多的人的下标

for (int i = 1; i <= 100; i++) {

for (int j = 1; j <= 100; j++) {

a[0][i] += a[j][i];

}

if (a[0][i] > a[0][max])

max = i;

}

cout << max << endl;

bool isfirst=true;

for (int i = 1; i <= 100; i++) {

if ((a[i][max]) && (isfirst)) {

cout << i;

isfirst = false;

}

else if ((a[i][max]) && (!isfirst))

cout << " " << i;

}

return 0;

}

解析:【喵呜刷题小喵解析】:该题目要求找出被提及最多的用户,并输出提及该用户的人。首先,我们定义一个二维数组a[101][101],其中a[i][j]表示用户i是否提及用户j。然后,我们遍历每一条微博,提取出发送者(sender)和提及者(mentioned),将a[sender][mentioned]的值加1,表示用户sender提到了用户mentioned。接着,我们定义一个一维数组a[101],用于统计每个用户的被提及次数。对于每一个用户j,我们遍历所有的发送者i,将a[j]的值加上a[i][j]。然后,我们找到被提及次数最多的用户(max),并输出该用户的序号。最后,我们遍历所有的发送者i,如果a[i][max]的值为1,表示用户i提到了用户max,我们就输出用户i的序号。为了避免重复输出同一个用户,我们用一个布尔变量isfirst来标记是否已经输出过用户i。这样,我们就找到了被提及最多的用户,并输出了提及该用户的人。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年09月C语言二级答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share