蓝桥杯2024年1月STEMA考试【中高级组】答案+解析(上)

一、单选题

第一题 表达式 117 % 16 的结果是( )。

A. 0

B. 5

C. 7

D. 10

答案:B

解析:%求的是余数,117除以16的余数是5。

第二题 下列选项中,字符数组定义正确的是( )。

A. char a[5] = "hello";

B. char a[ ] = "hello";

C. char a = "hello";

D. char a[6] = 'hello';

答案:B

解析:考察字符数组定义与赋值。

定义一个字符数组并且用一个字符串常量初始化它时,数组的大小应该足够包含字符串常量的所有字符,包括结尾的空字符(‘\0’)。

在此题中,有一点需要注意:双引号带着的是字符串,字符串hello带有5个字符,但由于C语言风格的字符串要以空字符(‘\0’)结尾,实际上是需要6个字符空间才能存储整个字符串(包括结尾的 ‘\0’)。

因此A选项错误,正确应该是char a[6]="hello";

C选项是单一的字符,不能用双引号。

D选项的初始化用了单引号,错误。

字符数组的定义示例如下:

(1)char a[10]={‘h’,‘e’,‘l’,‘l’,‘o’}; 表示定义一个字符数组,含有10个元素,前面五个元素分别赋值为字母h,字母e,字母l,字母l和字母o,后面的元素赋值为空值,即null。

(2)char a[10]=“hello”; 和(1)相同,要注意,这里的元素个数一定要在字符串长度的基础上加1。

(3)char a[]=“hello”; 这种写法是没有固定元素个数,单独写是错误的,但如果有初始化,程序就会自动根据字符数组的实际长度进行调整。

第三题 定义 int i = 0, a = 10; 执行表达式 a = (i <= 0 ? 1 : 2) 后,a 的值是( )。

A. 1

B. 2

C. 10

D. 随机值

答案:A

解析:考察三目运算符

(i <= 0 ? 1 : 2)转换成 if 语句:

if(i<=0)
    a=1;
 else
    a=2;

定义中,int i = 0, a = 10;i=0,因此a=1,所以选A。

第四题 十进制数 22.5625 转换成十六进制数是( )。

A. 16.7

B. 16.8

C. 16.9

D. 17.1

答案:C

解析:分为两部分

整数部分:

十进制22转换成十六进制使用如下短除法,结果为16。
短除法
小数部分:用乘法,乘到整数即可。
小数部分

结合起来,就是16.9。

第五题 定义 int a[5] = {1, 2, 3, 4, 5}, *p = a, *q = p++; 那么 *p*q 的值分别是( )。

A. 2、3

B. 3、2

C. 1、2

D. 2、1

答案:D

解析:

考查一维数组、指针、自增

*p=a即取 a 数组的第一个元素的值,即 1。

*q=p++ 需要分成两个部分,p++,即1+1=2,所以 *p的值就是2,而q则是*q=p,所以*q的值是2,*p的值为1。

所以答案选D。

该题和下方类似:

int x=10,c;
c=x++;
cout<<c<<endl<<x;

c的值是10,x的值是11。

二、编程题

第一题 编程实现:第二大的数

题目描述:

给定三个不同的整数,请找出其中第二大的数。例如:三个整数分别为 30、20、25,其中第二大的数是 25。

输入描述:

一行输入三个不同的整数 a,b,c(1≤a,b,c≤1000),整数之间以一个空格隔开。

输出描述:

输出一个整数,表示三个整数中第二大的数。

样例输入:

30 20 25

样例输出:

25

解析:

根据输入描述,确定三个整数a,b,c:int a,b,c;

因为有三个数,所以可以先找最大值,再找最小值,再将三个值相加之后,进行相减,即可得到第二大的值。

定义一个整数,用于计算总和:int sum=0;

最大值:int maxx=max(a,max(b,c));

最小值:int minn=min(a,min(b,c));

用总和减去最大值和最小值,即可得到正确答案。

这里用到了max和min函数,这两个函数只能比较两个值的大小,因此需要嵌套使用,最好用万能头文件或者cmath头文件哦~

参考代码:

#include<iostream>
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int main()
{
        int a,b,c;
        cin>>a>>b>>c;
        int sum;
        sum=a+b+c;
        int maxx=max(a,max(b,c));
        int minn=min(a,min(b,c));
        cout<<sum-maxx-minn; 
        return 0;
}

说在题外,有同学使用数组的方法,也是可以的。有兴趣的同学可以看看~

数组方法:将数据输入到数组中,再对数组进行排序,输出第二个即可。

#include<iostream>
#include<algorithm>//排序用到的头文件
#include<bits/stdc++.h> 
using namespace std;
int main()
{
        int a[4];
        for(int i=1;i<=3;i++)
        {
                cin>>a[i];
        }
        sort(a+1,a+1+3);    //从小到大进行排序 
        cout<<a[2];        //输出第二个 
        return 0;
}

第二题 编程实现:奇妙数

提示信息:

如果一个整数能够被它的各位上的非零数字整除,则称该数为奇妙数。

例如:

整数 102,它的各位上的非零数字为 1 和 2,102 既能被 1 整除,也能被 2 整除,所以 102 是奇妙数;

整数 456,它的各位上的非零数字为 4、5 和 6,456 能被 4 和 6 整除,但不能被 5 整除,所以 456 不是奇妙数。

题目描述:

给定两个整数 n 和 m,请输出 n 到 m 之间(包含 n 和 m)所有的奇妙数;若不存在奇妙数,则输出 -1。

输入描述:

一行输入两个整数 n 和 m(1≤n≤m≤100000),整数之间以一个空格隔开。

输出描述:

按照从小到大的顺序输出 n 到 m 之间(包含 n 和 m)所有的奇妙数,整数之间以一个空格隔开;若不存在奇妙数,则输出 -1。

样例输入:

10 20

样例输出:

10 11 12 15 20

解析:

根据输入描述,确定输入两个整数:int m,n; cin>>n>>m;

在 n 和 m 中找奇妙数,所以需要使用 for 循环进行遍历:for(int i=n;i<=m;i++)

根据题目中奇妙数的描述,可以对用一个函数实现奇妙数的判断,假设函数名为qm,判断输入的参数 x 是否为奇妙数。

需要做到对数值每一位进行拆分,方法使用 while 循环。

bool qm(int x)
{
    int y=x;    //单独将x提取出来
    while(y)    //拆分y的每一位
    {
        if(y%10!=0&&(x%(y%10)!=0)) return false;//不整除,则返回false
        y/=10;    //缩小
    }
    return true;//其他情况,返回true
 }

结合在一起,得到以下代码。

参考代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool qm(int x)
{
    int y=x;    //单独将x提取出来
    while(y)    //拆分y的每一位
    {
        if(y%10!=0&&(x%(y%10)!=0)) return false;//不整除,则返回false
        y/=10;    //缩小
    }
    return true;//其他情况,返回true
 }
int main()
{        
    int n,m;
    int flag=0;        //用于判断是否输出-1
    cin>>n>>m;
    for(int i=n;i<=m;i++)
    {
        if(qm(i)==true)
        {
            cout<<i<<" ";
            flag=1;        //有奇妙数,将标记转为1
        }
   }
   if(flag==1) cout<<-1;    //如果标记还是等于0,证明没有奇妙数,直接输出-1
   return 0;
}

第三题 编程实现:字符矩阵

题目描述:

给定一个仅包含小写字母的字符串 S,用这些字符恰好排成一个 n 行 m
列的矩阵(m≥n),请找出所有符合要求的矩阵中最接近于正方形的那个矩阵。然后从第一列开始,逐列按照从上到下的顺序输出矩阵中的字符。

例如:

S = “abcdefgh”。按要求 m≥n 有如下两种矩阵:
两种矩阵

最接近正方形的矩阵是第一种。从第一列开始,逐列按照从上到下的顺序输出矩阵中的字符,结果为:aebfcgdh。

输入描述:

输入一个字符串,仅包含小写字母且长度不超过 200。

输出描述:

请找出符合题目要求的最接近正方形的字符矩阵,从第一列开始,逐列按照从上到下的顺序输出矩阵中的字符。

样例输入:

abcdefgh

样例输出:

aebfcgdh

解析:

根据输入描述,输入一个字符串,所以:string s; cin>>s;

根据题目的意思,需要将字符排成 n 行 m 列的矩阵,要接近于正方形,首先要做的就是计算字符串的长度:int len=s.length()

长度计算完成之后,我们需要确认,是否能够形成正方形,如果刚好能够形成,就是两条边相等,需要对len开平方。

举个例子,如果长度为 9 时,sqrt(9)=3,则刚好是 3 行 3 列的二维数组。

假如不是,那么就需要 m>=n,所以,需要将边长从开平方数往下遍历:for(int n=sqrt(len);n>=1;n--)

为 n 列的遍历情况,m 直接用 len/n,直到两个n*m==len 即可跳出。

int n,m;
for(n=sqrt(len);n>=1;n--)
{
    m=len/n;
    if(n*m==len) break;
}

确认好 m 和 n 之后,就可以将字符串存入到二维数组中。

int k=0;        //字符串下标从0开始
for(int i=1;i<=n;i++)
{
    for(int j=1;j<=m;j++)
    {
        a[i][j]=s[k];
        k++;       //递增放入
    }
}

之后按要求:从第一列开始,逐列按照从上到下的顺序输出矩阵中的字符,直接将二维数组中的位置替换即可。

for(int j=1;j<=m;j++)
{
    for(int i=1;i<=n;i++)
    {
        cout<<a[i][j];
    }
}

以上,即可完成!

参考代码:

#include<iostream>
#include <bits/stdc++.h>
using namespace std;
string s;
char a[210][210];//长度不超过200
int main()
{        
    string s;
    cin>>s;
    int len=s.length();
    //确认 n 和 m
    int n,m;
    for(n=sqrt(len);n>=1;n--)
    {
        m=len/n;
        if(n*m==len) break;
    }
    cout<<len<<" "<<m<<" "<<n;
    int k=0;        //字符串下标从0开始
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            a[i][j]=s[k];
            k++;       //递增放入
        }
    }
    for(int j=1;j<=m;j++)
    {
        for(int i=1;i<=n;i++)
        {
            cout<<a[i][j];
        }
    }
    return 0;
}
  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员莫小特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值