本文最后更新于 21 天前,其中的信息可能已经有所发展或是发生改变。
质数判断条件
public static boolean isPrime(int n) {
if (n < 2) return false; // 小于2的不是质数
if (n == 2) return true; // 2是质数
if (n % 2 == 0) return false; // 偶数不是质数
// 核心部分:检查奇数因子
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) { // 如果找到能整除的数
return false; // 不是质数
}
}
return true; // 没找到因子,是质数
}
P12154
数到2025会溢出,要使用long
P8657
String date = sc.nextLine(); // 1. 读取用户输入的整行字符串
String[] parts = date.split("/"); // 2. 用"/"分割字符串,得到数组
int a = Integer.parseInt(parts[0]); // 3. 将第一个部分转为整数
int b = Integer.parseInt(parts[1]); // 4. 将第二个部分转为整数
int c = Integer.parseInt(parts[2]); // 5. 将第三个部分转为整数
这是把字符串给分割然后转换为数字的步骤
String date = sc.nextLine();
String shuzhu[] = date.splite("/");
int one_p = Integer.parseInt(shuzhu[0]);
int two_p = Integer.parseInt(shuzhu[1]);
int three_p = Integer.parseInt(shuzhu[2]);
p12323
思路:
因为202320232023这个数实在是太大了,而每当x5阶乘最后的结果就会加上一个0,而题目又说最后9位数非0,因此就是想要你算到44!,所以直接求到44!阶乘的累加就好了
P8651
这题代码好多,大概是挺多小方法穿起来的
思路:
检查日期合法性
- 判断月,日的范围
- 二月天数与闰年有关,因此使用leapyear判断
- 之后创建数组存储月和日对应的日期,使用三元组判断,是闰年三元组就加1,不是就加0
- 创建好映射后再判断是否大于所在月天数
static boolean isv(int year,int month,int day){
if (month <1 || month >12){
return false;
}
if (day <1 || day >31) return false;
int day_M = {31,28+(isLeapyear(year)? 1:0),31,30,31,30,31,31,30,31,30,31};
return day <= day_M[month -];
}
去重树set
Set
<String> result = new TreeSet<>();
检查枚举可能性+匹配题意格式
如果格式符合时把结果输出到集合之中
static boolean matchi(int year, int month, int day, int a, int b, int c){
int yeartail = year %100;
if (yeartail ==a && month == b && day == c){
return true;
}
if (month == a && day == b && yeartail == c){
return true;
}
if(day ==a && month ==b && yeartail == c){
return true;
}
return false;
}
P15430
等差公式性质:
k = 2j -i
假设有i,j,k三个数,由于j - i == k - j
所以推导得k = 2j -i
P12340
虽然位移了,但是对比一下第一行,每次位移加一,第一行是0的情况下,想要找到A的绝对索引就是(start – a)%7 == 2/5
也可以反复品鉴一下,因为至少这个的思路能看懂
B2074
同余定理
递归运算
阶乘的话,阶乘的核心代码是:
阶乘的核心递推关系就是:
**n! = (n-1)! × n**(当 n ≥ 1)
使用高精度实现时,是这样的:
import java.math.BigInteger;
public static BigInteger factorialBig(int n) {
if (n < 0) {
throw new IllegalArgumentException("n must be >= 0");
}
BigInteger result = BigInteger.ONE;
for (int i = 2; i <= n; i++) {
result = result.multiply(BigInteger.valueOf(i));
}
return result;
}
P9244
String str = "Hello";
char[] charArray = str.toCharArray();
字符串不需要有转数组遍历的想法
直接使用str.length()和str.charAt()外头套上个for循环就好了
sc.next针对的是String,如果要使用char时需要再次用到At,格式如下:
char a = sc.next().charAt(0)
p11042
`java.util.Arraylist
list = new java.util.Arraylist();` 新建动态数组的方法 `list.add(s.cahrAt(i) – ‘0’);` char转int 类斐波那契的解题思路: 题干求10000000以内最大的,所以使用i–递减。 之后使用check函数查看是否满足条件,条件为: – 把long函数换成str函数,然后看str字串的长度 – 看是因为这个数列的和是看str字串的长度之和,比如这是一个139的数,字串长度为3,因此这个数列是前3项之和 – 边界判断:长度为1就是可以直接返回true了 – 使用list接受接下来不断增加增长的数列,直到n == sum – for循环的条件体现为,i= 数组长度- str字串的长度 回去看: P11004 不是纯暴力 P11042 迷思 学习 = 不断重复的过程,重复到一定度开始学习新的东西