大一刷题总结--15届蓝桥杯第二期模拟赛题单

💯15届蓝桥杯第二期模拟赛题单(C、J、P)

点击跳转到题单
TIPS:使用C,C++
tips:此帖为博主总结题目,不喜勿喷

NO.7934 字符显示

点击跳转

问题描述:小蓝要在屏幕上放置一行文字,每个字的宽度相同。小蓝发现,如果每个字的宽为36 像素,一行正好放下30个字,字符之间和前后都没有任何空隙。请问,如果每个字宽为 10 像素,字符之间不包含空隙,一行可以放下多少个字?

送分题

#include <stdio.h>
int main()
{
    printf("%d",36*30/10);
    return 0;
}

NO.7935 求余

点击跳转

问题描述:求2^2023 mod 1000,即2的2023次方除以1000的余数


公式:a%b=((a1%b)*(a2%b))%b,其中a1*a2=a。

递归

C/C++(C++函数相同)

#include <stdio.h>
#include <math.h>
int Num(int num)
{
    if (num < 10)
        return pow(2,num);
    if (num == 10)
        return 24;
    return (Num(num/2)*Num(num-num/2))%1000;
}
int main()
{
    int res = Num(2023);
    printf("%d",res);
    return 0;
}

tips:由于本题是填空题,熟悉python的话可以运行以下语句得出答案

python

import os
import sys
#直接利用python内置函数即可
res = pow(2,2023,1000)
print(res)

NO.7936 数位和相等

点击跳转

问题描述:如果一个正整数转化成二进制与转换成八进制后所有数位的数字之和相等,则称为数位和相等的数。前几个数位和相等的正整数为1,8,9,64…请问第23个数位和相等的正整数是多少?

思路:从1开始递增,每次将该数字转化为2进制数位和与八进制数位和之后,判断即可。

C/C++(C++函数相同)

#include <stdio.h>
int two(int num) {
    int temp = 0;
    while (num != 0) {
        temp += num % 2;
        num /= 2;
    }
    return temp;
}
int eight(int num)
{
    int temp = 0;
    while (num != 0) {
        temp += num % 8;
        num /= 8;
    }
    return temp;
}
int main()
{
    int num = 0;
    int i = 0;
    while (num < 23) {
        i++;
        int temp2 = two(i);
        int temp8 = eight(i);
        if (temp2 == temp8)
            num++;
    }
    printf("%d",i);
    return 0;
}

NO.7937 最多约数

点击跳转

问题描述:对于以下这些数(6 行,每行 6 个,共36 个),请问约数个数最多的是哪个?(如果有多个,请回答出现最早的那个。

以下是输入的数据

393353 901440 123481 850930 423154 240461

373746 232926 396677 486579 744860 468782

941389 777714 992588 343292 385198 876426

483857 241899 544851 647930 772403 109929

882745 372491 877710 340000 659788 658675

296521 491295 609764 718967 842000 670302

思路:由于本题为填空题,我们暴力破解即可

C/C++(C++函数相同)

#include <stdio.h>
// int Sum(int num)
// {
//     int n = 0;
//     for (int i = 2; i < num; i++)
//         if (num % i == 0)
//             n++;
//     return n;
// }
int main()
{
    // int Max = -1;
    // int nums[6][6];
    // for (int i = 0; i < 6; i++)
    //     for (int j = 0; j < 6; j++)
    //         scanf("%d",&nums[i][j]);
    // int nums1[6][6] = {0};
    // for (int i = 0; i < 6; i++) {
    //     for (int j = 0; j < 6; j++) {
    //         nums1[i][j] = Sum(nums[i][j]);
    //         Max = Max>nums1[i][j]?Max:nums1[i][j];
    //     }
    // }
    // for (int i = 0; i < 6; i++)
    //     for (int j = 0; j < 6; j++)
    //         if (Max == nums1[i][j]) {
    //             printf("%d",nums[i][j]);
    //             return 0;
    //         }
    printf("%d",901440);
    return 0;
}

NO.7538 灌水

点击跳转

小蓝有一个01矩阵。他打算将第一行第一列的0变为2.变化过程有传染性,每个2的上下左右四个相邻的位置中的0都会变成2.知道最后每个2的周围都是1或2结束。问:最终矩阵有多少个2?

思路:从矩阵第一行第一列开始,判断上下左右是否为0;是0则继续搜索此位置

C/C++(C++函数相同)

#include <stdio.h>
// char nums[30][41];
// int sum = 0;
// void dfs(int i,int j)
// {
//     if (i < 0 || i >= 30 || j < 0 || j >= 40)
//         return;
//     if (nums[i][j] != '0')
//         return;
//     sum++;
//     nums[i][j] = '2';
//     dfs(i,j+1);
//     dfs(i,j-1);
//     dfs(i+1,j);
//     dfs(i-1,j);
// }
int main()
{
    // for (int i = 0; i < 30; i++)
    //     scanf("%s",nums[i]);
    // dfs(0,0);
    // printf("%d",sum);
    printf("%d",541);
    return 0;
}

NO.7939 循环位移

点击跳转

问题描述:给定一个正好六位的正整数 x,请将 x 循环左移一位后输出。

所谓循环左移一位,是指将原来的十万位变为个位,原来的万位到个位向左移动依次变为十万位到十位。
例如:194910左移一位变为949101。
又如:987123左移一位变为871239。

输入格式

输入一行包含一个整数 2。保证输入的 2 正好包含 6个十进制数位,而且十万位和万位上的数字均不为0。

输出格式

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

C/C++(C++函数相同)

#include <stdio.h>
int main()
{
    int num;
    scanf("%d",&num);
    num = (num/100000) + (num%100000)*10;
    printf("%d",num);
    return 0;
}

NO.7940 最后的元音

点击跳转

问题描述:输入一个仅包含小写英文字母的字符串,请问这个字符串中的最后一个元音是什么?

在英文中,a,e,i,o,u 共5个字母是元音字,其它字母不是元音字母。

输入格式

输入一行包含一个字符串,仅由小写英文字符组成,字符串中至少包含一个元音字母

输出格式

输出一行包含一个字符,表示答案。

思路:反向遍历字符数组即可

C

#include <stdio.h>
#include <string.h>
int main()
{
    char str[10000];
    scanf("%s",str);
    int size = strlen(str);
    for (int i = size - 1; i >= 0; i--) {
        if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u') {
            printf("%c",str[i]);
            break;
        }
    }
    return 0;
}

C++

#include <iostream>
using namespace std;
int main()
{
  	string str;
    cin >> str;
    int size = str.length();
    int i;
    for (i = size - 1; i >= 0; i--) {
        if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u') {
            printf("%c",str[i]);
            return 0;
        }
  }
  return 0;
}

NO.7941 转换次数

点击跳转

问题描述:

给定一个整数,对这个整数的一次转换是指将这个整数变为这个整数的所有数位上的非零数字的乘积。
例如,对123456789进行一次转换变为1x2x3X4x5x6x7x8x9362880,再进行一次转换变为3X6x2x8x8=2304,再进行一次转换变为2X3x424,再进行一次转换变为 8。
给定一个整数请依次将转换过程中经历的每个整数输出直到小于 10。

输入格式

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

输出格式

输出多行,每行包含一个整数。

思路:直接翻译题意即可

C/C++(C++函数相同)

#include <stdio.h>
int main()
{
  long long num;
    scanf("%lld",&num);
    long long temp;
    while (num >= 10) {
        temp = 1;
        while (num != 0) {
            long long temp1 = num % 10;
            if (temp1)
                temp *= temp1;
            num /= 10;
        }
        num = temp;
        printf("%lld\n",num);
    }
  return 0;
}

NO.7942 公约移动

点击跳转

问题描述:小蓝站在一个n行m列的方格图中,方格图的每一个方格上都标有一个正整数。如果两个相邻方格(上下左右四个方向相邻) 内的数的最大公约数大于1,则可以从其中一个方格移动到另一个方格,当然也可以从另一个方格移回第一个方格。

假设小蓝开始时站在第r行第c列,请问小蓝可以移动到方格图内的多少个方格?

输入格式

输入的第一行包含两个整数n,m,用一个空格分隔,表示方格图的行数和列数。
接下来n行,每行包含m个正整数,相整数间用一个空格分隔,依次表示方格图中从第1行到第n行,每行从第1列到第m列中的数。
接下来一行包含两个整数r,c,用一个空格分隔,表示小蓝所在的行号和列号。

输出格式

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

思路:1.求两个数的最大公约数

2.建立一个与储存方格数组等大的数组,用来记录这一格是否已经判断过

3.从(r,c)开始,每次判断这一格的上下左右是否符合情况

C/C++(C++函数相同)

#include <stdio.h>
int num[1001][1001];
int nums[1001][1001] = {0};
int n,m,res = 0;
//求最大公约数
int fun(int x, int y)
{
    int z = y;
    while(x % y != 0)
    {
        z = x % y;
        x = y;
        y = z;
    }
    return z;
}
//DFS搜索
void dfs(int i,int j)
{
    if (i <= 0 || i > n || j <= 0 || j > m)
        return;
    if (!num[i][j]) {
        num[i][j] = 1;
        res++;
        if (j < m && fun(nums[i][j],nums[i][j+1]) > 1)
            dfs(i,j+1);
        if (j > 1 && fun(nums[i][j],nums[i][j-1]) > 1)
            dfs(i,j-1);
        if (i < n && fun(nums[i][j],nums[i+1][j]) > 1)
            dfs(i+1,j);
        if (i > 1 && fun(nums[i][j],nums[i-1][j]) > 1)
            dfs(i-1,j);
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d",&nums[i][j]);
    int r,c;
    scanf("%d %d",&r,&c);
    dfs(r,c);
    printf("%d",res);
    return 0;
}

NO.7943 区间最大和

点击跳转

问题描述:给定一个序列 a[1],a[2],…,a[n] 和一个整数 k,请找出个长度正好为k的区间,便得区间中所有数的和最大。即要找到一个整数p,使得1<=p且p+k-1<=n,使得ap+a[p+1]+···+a[p+k-1] 最大。

输入格式

输入的第一行包含两个整数 n k
第二行包含n个整数,相邻的整数之间使用一个空格分隔表示给定的序列。

输出格式

输出一行包含一个整数,表示最大的区间和,你只需要输出和就行,不需要输出方案。

思路:按题中思路遍历数组即可

C/C++(C++函数相同)

#include <stdio.h>
long long MaximumSumOfIntervals()
{
    int n,k;
    int i,j;
    long long res;
    long long num;
    scanf("%d %d",&n,&k);
    int nums[n];
    for (i = 0; i < n; i++)
        scanf("%d",nums+i);
    for (i = 0; i < k; i++){
        res += nums[i];
    }
    j = 0;
    num = res;
    for (i = k; i < n; i++) {
        num = num-nums[j]+nums[i];
        res = res>num?res:num;
        j++;
    }
    return res;
}
int main()
{
    long long res = MaximumSumOfIntervals();
    printf("%lld",res);
    return 0;
}

NO.7944 最大落差

点击跳转

问题描述: 给定一个序列 a[1],a[2],…,a[ n],如果对于某个下标i,a[i+1]<a[i],则称序列在i到i+1这个位置下落,落差为a[i]-a[i+1]。请问序列的最大落差是多少?

输入格式

输入的第一行包含一个整数 n,表示序列的长度。
第二行包含n个整数,相邻的整数之间使用一个空格分隔表示给定的序列。

输出格式

输出一行包含一个整数,表示答案。如果没有位置下落,输出。

思路:从左到右遍历相邻的数组元素,判断即可。
#include <stdio.h>
int main()
{
    int n,i,res=0;
    scanf("%d",&n);
    int nums[n];
    for (i = 0; i < n; i++)
        scanf("%d",&nums[i]);
    for (int i = 0; i < n - 1; i++) {
        if (nums[i]<nums[i+1])
            continue;
        int temp = nums[i]-nums[i+1];
        res = res>temp?res:temp;
    }
    printf("%d",res);
    return 0;
}
  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值