第一题: 9数算式
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
观察如下的算式:
9213×85674=7893145629213×85674=789314562
左边的乘数和被乘数正好用到了 11 ~ 99 的所有数字,每个 11 次。 而乘积恰好也是用到了 11 ~ 99 的所有数字,并且每个 11 次。
请你借助计算机的强大计算能力,找出满足如上要求的 99 数算式一共有多少个?
注意:
总数目包含题目给出的那个示例。
乘数和被乘数交换后作为同一方案来看待。
寄寄~~~~~~~为什么我爆搜错了呀?
正确答案是1625。
![](https://i-blog.csdnimg.cn/blog_migrate/4203f3ac3857588ca363c922dc9b146e.png)
第二题: 山
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
这天小明正在学数数。
他突然发现有些止整数的形状像一挫 “山”, 比㓚 123565321、145541123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。
小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022,2022222022][2022,2022222022] 中有 多少个数的形状像一座 “山”。
解题思路:
遍历区间里的每个数, 将这个数转换为字符串来处理,剩下就是处理字符串回文。
![](https://i-blog.csdnimg.cn/blog_migrate/1ccffd6392fafc6883c8cbf350a55f0e.png)
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);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/87a7566ec2d6201f8f4e8f6e9eeaac25.png)
第三题: 最少刷题数
![](https://i-blog.csdnimg.cn/blog_migrate/252f8c11a5e1339f26b13e439ede2f1d.png)
解题思路:
求 每一道题 有 多少 个人刷,把每个输入的数记录下在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] + " ");
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6e26a77d4390a2ee841bea449cb66d44.png)
![](https://i-blog.csdnimg.cn/blog_migrate/285e666cd0901092045b6637bdc12301.png)
第四题: 完全平方数
![](https://i-blog.csdnimg.cn/blog_migrate/7d2812bef815a3d82df0efd6e6450ea4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2d326614a32f3eb735c732c62848e069.png)
解题思路:
通过观察发现,一个数可以拆分成 多个 质素相乘, 而 完全平方数的每个质素个数都是偶数。于是只需拆分出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
*/
![](https://i-blog.csdnimg.cn/blog_migrate/81a8389e03fe6ddc4d9db079bcbb6fff.png)
欢迎交流~~