返回
蓝桥杯 Java 第十届 C 组题解,解析学习!
闲谈
2023-11-15 17:03:53
题目一:数字统计
题目
给定一个正整数 n,统计从 $1$ 到 n 中有多少个数字满足以下条件:数字中的每个数字都小于或等于 m。
输入格式:
第一行包含两个正整数 n 和 m,用空格隔开。
输出格式:
输出一个整数,表示满足条件的数字的个数。
样例输入:
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。求所有可能的分割方案的个数。
输入格式:
第一行包含三个正整数 n、k 和 m,用空格隔开。
输出格式:
输出一个整数,表示所有可能的分割方案的个数。
样例输入:
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);
}
}