【第十四届蓝桥杯三月真题刷题训练——第 4 天(3.7)& 9数算式 & 山 & 最少刷题数 & 完全平方数】

第一题: 9数算式

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

观察如下的算式:

9213×85674=7893145629213×85674=789314562

左边的乘数和被乘数正好用到了 11 ~ 99 的所有数字,每个 11 次。 而乘积恰好也是用到了 11 ~ 99 的所有数字,并且每个 11 次。

请你借助计算机的强大计算能力,找出满足如上要求的 99 数算式一共有多少个?

注意:

  1. 总数目包含题目给出的那个示例。

  1. 乘数和被乘数交换后作为同一方案来看待。

寄寄~~~~~~~为什么我爆搜错了呀?

正确答案是1625。

第二题: 山

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

这天小明正在学数数。

他突然发现有些止整数的形状像一挫 “山”, 比㓚 123565321、145541123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。

小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022,2022222022][2022,2022222022] 中有 多少个数的形状像一座 “山”。

解题思路:

遍历区间里的每个数, 将这个数转换为字符串来处理,剩下就是处理字符串回文。

public class Main {
    
    static int res;

    static boolean check(long x) {
        String s = x + ""; // 变成字符串处理
        int n = s.length();
        for(int i = 0; i < n/2; i++) {
            int a = s.charAt(i) - '0', b = s.charAt(i+1) - '0';
            int c = s.charAt(n-i-1) - '0'; // 后面的数, 和a对称
            if(a > b) return false;
            if(a != c)    return false;
        }
        
        return true;
    }
    
    public static void main(String[] args) {
        
        for(long i = 2022; i <= 2022222022; i++) {
            if(check(i))
                res++;
        }
        System.out.println(res);
    }

}

第三题: 最少刷题数

解题思路:

求 每一道题 有 多少 个人刷,把每个输入的数记录下在a数组中,作为前缀和sum数组的下标,然后用前缀和进行统计人数。 最后遍历a数组, 如果 该题人数符合题意,则不用刷题,b数组置为0, 如果不符合,则二分求出 刷高分题人数 <= 刷低分题人数 应该对应的 题数量是多少。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    static int N = (int)1e5 + 10;
    static int[] a = new int[N];
    static int[] b = new int[N];
    static int[] sum = new int[N];
    static int n;
    
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        String[] s = br.readLine().split(" ");
        
        for(int i = 1; i <= n; i++) {
            a[i] = Integer.parseInt(s[i-1]);
            sum[a[i]]++; // 每a[i]题数 有 多少人
        }
        
        for(int i = 1; i < N; i++) {
            sum[i] += sum[i-1]; //前缀和求出第i题以下对应的人数
        }
        
        for(int i = 1; i <= n; i++) {
              // Math.max  这个坑点, a[i] 可能为0。
            if(sum[Math.max(0, a[i]-1)] >= sum[N-1] - sum[a[i]]) {
                b[i] = 0;
            }else {
                int l = a[i]+1, r = N;
                while(l < r) {
                    int mid = (l+r) >> 1;
                    // 左边是小于mid题人数,右边是大于mid题人数,减一是不包含当前i
                    if(sum[mid-1]-1 >= sum[N-1]-sum[mid] ) r = mid;
                    else    l = mid+1;
                }
                b[i] = r - a[i];
            }
        }
        
        for(int i = 1; i <= n; i++) {
            System.out.print(b[i] + " ");
        }

        
    }

}

第四题: 完全平方数

解题思路:

通过观察发现,一个数可以拆分成 多个 质素相乘, 而 完全平方数的每个质素个数都是偶数。于是只需拆分出n的每个质素,检查每个质素个数是否为偶数,如果不是,则 把该质素 乘 入 答案res。

import java.util.Scanner;

public class Main {
    static int N = (int)1e7+10;
    static long res = 1;
    
    
    static void divided(long x) {
        for(long i = 2; i <= x/i; i++) {
            long cnt = 0; // 标记每个质素的个数
            if(x % i == 0) {
                while(x % i == 0) {
                    x /= i;
                    cnt++;
                }
            }
            if(cnt % 2 == 1) {
                res *= i; // 个数为奇数,则加入
            }
        }
        if(x > 0) {
            res *= x; 
        }
    }
    
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        long n = s.nextLong();
        divided(n);
        System.out.println(res);

    }

}
/*
 43435534543
 */

欢迎交流~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值