2025蓝桥杯C++研究生组真题-上海市省赛

2025蓝桥杯C++研究生组真题

A:数位倍数(5分)

问题描述:请问在 1 至 202504(含)中,有多少个数的各个数位之和是 5 的整数倍。例如:5、19、8025 都是这样的数。

A是填空题,直接写出答案。40500

解题思路:

暴力解法:遍历所有数字,对于每个数字,202504,计算各个数位的和。然后条件判断如何是5的倍数,那么计数累加。

关键点:1、如何计算一个数(例如202504)的各个数位之和。

答:通过取模%10 、整除/10 实现逐位提取,然后累加。

例如取模%10,可以实现把个位4提取出来。202504 / 10 = 202500 .... 4, num % 10 取个位值

num整除10,num/= 10可以实现逐步右移数字。例如 123 / 10 =1212 / 10→ 1

2、保护循环变量,使用临时变量num代替 i, 避免修改循环变量导致的逻辑错误。

需要变量,

cnt计数有多少个数是5的倍数。num是要被拆解各个数位的数,也是循环增加的数。sum用于计算拆解下来的各个数位,num++之后sum要归0,

用while循环,来分解num的每一位并累加。

#include<bits/stdc++.h>
using namespace std;

int main(){
    int cnt;
    int a,b;
    cin >> a >> b;
    
    // 遍历从 a 到 b 的所有数字
    for(int i=a; i<=b; i++){
        int sum = 0;    // 用于累加当前数字的各位之和
        
        int num = i;   // 临时变量,避免直接修改循环变量i
         分解num的每一位并累加
        while(num > 0){
            sum += num % 10;    //取num的最后一位。123 % 10 = 3
            num /= 10;    //去掉已经处理过的最后一位。 123 -> 12 -> 1 -> 0
        }
        
        if(sum % 5 == 0){
            cnt++;
        }
    }  
    cout << "符合条件的数字个数:" << cnt << endl;
    return 0;  
}

后面还有一些题目,时间原因,后续慢慢更新题解。

  1. B:IPv6 (5分)

  1. C:变换数组 (10分)

【问题描述】

    输入一个数组 a ,包含有 n 个元素 a1,a2,…,an。对这个数组进行 m 次变换,每次变换会将数组 a 中的每个元素 ai 转换为 ai · bitCount(ai)。其中 bitCount(x) 表示数字 x 的二进制表示中 1 出现的次数,例如 bitCount(3)=2,因为 3 的二进制表示为 11,其中 1 出现了两次。

    请输出变换之后的数组内容。

【输入格式】

    输入的第一行包含一个正整数 n ,表示数组 a 中的元素个数。

    第二行包含 n 个整数 a1,a2,…,an,相邻整数之间使用一个空格分隔。

    第三行包含一个整数 m,表示变换次数。

【输出格式】

    输出一行,包含 n 个整数,相邻整数之间使用一个空格分隔,表示变换之后得到的数组 a。

【样例输入】

2

5 7

2

【样例说明】

    5=(101)2,7=(111) 2,第一次变化后 a=[10,21]。

    10=(1010) 2,21=(10101) 2,第二次变换后 a=[20,63]。

【样例输出】

20 63

解题关键:

  • bitCount(int x)函数。输入一个十进制数x,统计x的二进制数里面的1的个数。

解题思路:

遍历数组,循环m次,表示做m次变换。

对每轮变换中:对每个数ai,调用bitCount(ai),然后ai = ai * bitCount(ai) 就是就是每个元素每轮做的变换。

关键代码如下:

//m次变换
for(int i=0; i<m; i++){
    //每轮变换,遍历所有数组元素。
    for(int j=0; j<num.size(); j++){
        num[i] = num[i] * bitCount(num[i]);
    }
}
  1. D:最大数字(10分)

【问题描述】

    我们有 n 个连续的整数 1,2,3,…,n,可以自由排列它们的顺序。

    然后,我们把这些数字转换成二进制表示,按照排列顺序拼接形成一个新的二进制数。

    我们的目标是让这个二进制数的值最大,并输出这个二进制对应的十进制表示。

【输入格式】

    输入一行包含一个正整数 n 。

【输出格式】

    输出一行包含一个整数表示答案。

【样例输入】

3

1

【样例输出】

30

1

【样例说明】

    1 的二进制为 1;2 的二进制为 10;3 的二进制为 11;其组成的最大的二进制数字为 11110,对应的十进制数字为 30。

  1. E:冷热数字队列(15分)

  1. F:01串(15分)

  1. G:甘蔗(20分)

  1. H:原料采购(20分)

题目参考的原文链接:https://blog.csdn.net/weixin_46560512/article/details/147169105

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值