1 首先是基础
1.1 数据类型
数据类型 | 关键字 | 内存占用 | 对应二进制位数 | 取值范围 |
---|---|---|---|---|
字节型 | byte | 1个字节1B | 8 | |
整形 | int(默认) | 4 | 4*8=32 | 0(符号位)+31个1 = 231-1 ≈ 2 * 109 |
短整型 | short | 2个字节 | -32768~32767 | |
长整形 | long | 8 | 8*8=64 | 0+63个1=263-1 ≈ 9*1018 |
单精度浮点数 | float | 4 | 1.4013E-45~3.4028E+38 | |
双精度浮点数 | double(默认) | 8 | 4.9E-324~1.7977E+308 | |
单斜体样式字符型 | char | 2 | 0-65535 | |
布尔类型 | boolean | 1 | true,false |
注意:
- 字符串类型(String)不是基本类型而是引用类型
- 浮点型可能只是一个近似值
- 数据范围与字节数无关,float(4字节)>long(8字节)
- 浮点数默认double,要使用float时
float f = 1.2F;
结尾要加F - 整数默认int,要用long
long l = 100L
后面要加L
1.2 求输入整数的位数
- int转为字符串
Integer.toString();
,再通过length()方法求得 - 通过循环除以10
/10
并记录次数,直到商为0时停止,得到的计数即为位数
1.3 给一个整数,求数位之和
在1.2 的条件下,通过%
取模并累加
1.4 判断回文数字
- 双指针
- 通过取模运算
2 质数判断
- 合数n = p1 * p2; p1, p2 >= 2
通过反证法:
假设p1 <= p2; 问:p1 < 根号n; 成立吗?
此时 n = p1 *p2 矛盾,
如果在 根号n 之前找不到n的因数,那么n就为质数
此时最大比较次数将从n12下降到n6
for (int i = 0; i * i < n; i++) {
if (n % i != 0) continue;
else return false;
}
return true // 整个循环都找不到因数的时候说明为质数
这里不要使用sqrt开根号函数,因为开出来是小数,而且需要计算
直接使
质数筛法
3 同余问题
乘法同余
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int m = in.nextInt();
int sum = 1;
if (b == 0) System.out.println(1);
for (int i = 1; i <= b; i++) {
sum = (sum % m * a % m);
}
System.out.print(sum);
}
}