返回

蓝桥杯 Java 第十届 C 组题解,解析学习!

闲谈

题目一:数字统计

题目

给定一个正整数 n,统计从 $1$ 到 n 中有多少个数字满足以下条件:数字中的每个数字都小于或等于 m

输入格式:

第一行包含两个正整数 nm,用空格隔开。

输出格式:

输出一个整数,表示满足条件的数字的个数。

样例输入:

100 9

样例输出:

63

思路:

本题的思路是遍历所有数字,筛选出满足条件的数字,然后相加得出答案。对于每个数字 i,我们将其转换为字符串 s_i,然后判断 s_i 中的每个字符是否都小于或等于 m。如果满足条件,则将 i 加入答案中。

实现:

import java.util.Scanner;

public class NumberStatistics {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();

        int count = 0;
        for (int i = 1; i <= n; i++) {
            String s = String.valueOf(i);
            boolean flag = true;
            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(j) - '0' > m) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                count++;
            }
        }

        System.out.println(count);
    }
}

题目二:数字分割

题目:

给定一个正整数 n,将其分割成 k 个正整数之和,要求每个正整数都大于等于 m。求所有可能的分割方案的个数。

输入格式:

第一行包含三个正整数 nkm,用空格隔开。

输出格式:

输出一个整数,表示所有可能的分割方案的个数。

样例输入:

10 3 2

样例输出:

10

思路:

本题的思路是利用个数、余数辗转相除直到 $0$。我们先计算出所有可能的分割方案的总个数,然后减去不满足条件的分割方案的个数即可。

实现:

import java.util.Scanner;

public class NumberSegmentation {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int m = in.nextInt();

        int total = 0;
        for (int i = 1; i <= n; i++) {
            if (i * k >= m) {
                total++;
            }
        }

        int invalid = 0;
        for (int i = 1; i <= n; i++) {
            if (i * k % m == 0) {
                invalid++;
            }
        }

        System.out.println(total - invalid);
    }
}

题目三:函数实现

题目:

给定一个函数 f(x) = x^2 + x + 1,求 f(x) = n 的解。

输入格式:

第一行包含一个整数 n

输出格式:

输出一个整数,表示 f(x) = n 的解。

样例输入:

10

样例输出:

2

思路:

本题的思路是利用 Heron 公式求解一元二次方程的根。Heron 公式如下:

x_{n+1} = \frac{1}{2} (x_n + \frac{n}{x_n})

其中 x_n 是方程 x^2 + x + 1 = n 的一个解。

实现:

import java.util.Scanner;

public class FunctionImplementation {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        double x = n;
        while (true) {
            double x_next = (1.0 / 2) * (x + (n / x));
            if (Math.abs(x_next - x) < 1e-6) {
                break;
            }
            x = x_next;
        }

        System.out.println((int) x);
    }
}