algorithm_java_notebook ==~~java==

==小tips==

求某个数的整数部分/小数部分

(int)强制转换得到整数部分->转换为String 用.length()方法可以获取整数位数 小数用整数减一下即可

关于/

1.被除数和除数皆为整型数据时
如果是整型数据进行除法运算,那么得到的结果就是被除数除以除数的结果,其结果必然是整型数据.
如果除不尽,会把得到的小数部分直接抹去,抹去的时候不要考虑四舍五入的规则

2.被除数和除数至少有一个为浮点型数据时
在除法运算中,如果里面有浮点型数据参与的话,那么结果一定会是浮点类型的数据,计算数值的话就按照我们平常小数和整数之间的除法计算去进行计算即可。
结果会保留小数部分.
(所以最好在分子或者坟墓上加一个==(double)==强制转换)

打印小数点位数

printf(“%.==2==f”,123.123);//结果123.12 显示两位小数
printf(“%.==5==f”,123.123);//结果123.12300 不足补0

运行速率

java比c++慢蛮多的 所以用java做算法的时候有些时候时间太长了 可能不是你的问题 泪的教训

方法传参

==java只传值==
如果是基本类型 只会复制变量值传递过去 所以当方法内修改传递过去的值时变量值不会改变
如果是引用类型(数组也是对象) 会复制其对象地址传递过去 所以当方法内修改了 引用类型也会修改

java初始化对象数组

Student stu[] = new Student[num]; 这行代码是在创建一个数组,而不是在实例化对象。你创建了一个数组来存储多个 Student 对象的引用,但==数组中的每个元素都需要被单独实例化==,否则数组中的元素都是 null,而不是有效的 Student 对象。

在Java中,数组创建后,==数组元素默认初始化为 null(对于引用类型)==。因此,你需要在数组中的每个元素上调用构造函数,以创建实际的 Student 对象。这就是为什么我在上一个回答中建议在循环内部使用 stu[i] = new Student(); 来实例化 Student 对象的原因。

==总结:创建完数组对象后 要再次用new 对象名();进行实例化==

==基本模块==

输入

Scanner ==数据超过一百万不建议使用==

==scanner需要了解的几个重要的基本点:==

==一定要注意理解当前元素和下一个元素的含义==

1.关于hasNext方法:
1>此方法用于判断迭代器==当前指向元素==是否为空(next()默认元素之间的分隔符为空格或者换行符 可以用==scanner.useDelimiter(String)==来替换 ==注意是替换而不是增加==)

​ ==理解:sc.hasNext()可以理解为把我们输入的值存到了sc当中而sc.next()可以理解为从sc中取值,取值后将标识符后移(可以理解为:取完值后这个值就不在了),如果sc中没有值了,它也会要求输入一个值(前面说了它们两都可以输入)。==

​ 2>此方法判断==当前元素==不为空时 会返回结果true 但是==当当前元素为空时他会阻塞方法 并不会返回false== 所以当我们使用while(scanner.hasNext())进行判断时会导致无法退出循环 不建议使用 上网查询到的一般解决办法是采取while(!scanner.hasNext(“#”))对hasNext()方法进行重载非负判断 但是笔者不太能理解这种方法的实在意义
​ 3>这里给出我的解决思路:当涉及scanner读取时 我一般采取next()对整行进行读取(如果涉及要读取空格采用nextLine()),然后再对读取到的字符串进行操作,==如果用next读取 又需要换行时用nextLine()先换行 再读取 nextLine读取会自动换行==——如果只是多个int或者double则直接用nextInt…即可
2.关于next方法:
​ 1>此方法用于获取迭代器当前元素的值 并且将引用移位++(==注意hasNext并不会使引用移位==)

3.关于nextLine方法:

​ 1>==nextLine输入双回车,会读取中间的空白字符串 但是 next会阻塞 等待输入==

4.关于next与nextLine方法:

​ 1> next与nextLine共用一个指针和缓冲区(参考next读取需要用nextLine进行换行)

​ 2>next不读取换行符 不会返回下一行的令牌 因为没数据了 nextLine也不读取换行符 但是会将光标移到下一行(参考next读取需要用nextLine进行换行)

​ 3>next与nextLine不建议共用 不然可能遇到换行符等问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//导入包
import java.util.Scanner;
//初始化一个scanner对象
Scanner scan = new Scanner(System.in);
//使用scan

scan.nextInt();//读取下一个整形数据 会pass掉空格和换行符
scan.nextDouble();
//nextLine():
//1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
//2、可以获得空白。
scan.nextLine();
//next():
//1、一定要读取到有效字符后才可以结束输入。
//2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
//3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
//不能得到带有空格的字符串。
scan.next();
//关于next()与nextLine()总结:当需要换行读取时:要么用next()读取第二行单个字符串或者!!用nextLine()进行换行操作!!,再从第二行开始读取

BufferedReader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//导入包
import java.io.*;
//构造方法
public BufferedReader(Reader in,int sz)
//创建一个使用指定大小输入缓冲区的缓冲字符输入流。
//in - 一个 Reader
//sz - 输入缓冲区的大小

public BufferedReader(Reader in)
//创建一个使用默认大小输入缓冲区的缓冲字符输入流。


//常用方法 都需要抛出异常
public int read() throws IOException
//读取单个字符。
//作为一个整数(ASCLL码)(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1

public int read(char[] cbuf) throws IOException
//一次读取一个字节数组
//cbuf - 目标缓冲区
//读取的字符数,如果已到达流的末尾,则返回 -1

public void close() throws IOException
//关闭该流并释放与之关联的所有资源。

//特有方法
public String readLine() throws IOException
//读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
//包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.*;
//常用固定格式(键盘读入):readLine
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String n = br.readLine();
System.out.println(n);
}catch(Exception e) {

}
}catch(Exception e){
//抛出异常
}

//read(有点奇怪 他的返回值是字符的ASCLL)
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char n = (char)br.read();//转化为了字符 一般不用特意关闭
System.out.println(n);
}catch(Exception e) {

}

输出

默认 System.out.print

==数据太大不建议使用 效率太低==

BufferedWriter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//导入包
import java.io.*;
//构造方法
BufferedWriter(Writer out) :
//默认缓冲区大小构造字符缓冲输出流对象

BufferedWriter(Writer out,int size):
//指定缓冲区大小

//常用方法
public void write(int c) throws IOException
//写入单个字符。
//c - 指定要写入字符的 int。

public void write(String str) throws IOException
//写入字符串。
//str - 要写入的字符串

public void close() throws IOException
//关闭此流,但要先刷新(flush)它。

//特有方法
public void newLine() throws IOException
//写入一个行分隔符。

//简单示例
public static void main(String[] args) throws Exception {
//创建一个字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")) ;
//写数据
bw.write("hello");
bw.write("world");
//刷新流
bw.flush();
//关闭资源
bw.close();

}
1
2
3
4
5
6
7
8
9
10
11
12
import java.io.*;
//控制台输出
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
char n = (char)br.read();
bw.write(n);
bw.flush();
bw.close();//一定需要关闭 不同于输入
}catch(Exception e) {

}

数值计算

Math

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//导入包
import java.math.*;
//求绝对值
Math.abs();
//计算方根
Math.sqrt();
//向上取整
Math.ceil();
//向下取整
Math.floor();
//四舍五入
Math.round();//?保留小数位数?
//计算两个数的较大值(较小值)
Math.max( , );
Math.min( , );
//生成一个随机数(0< & <1)
Math.random();
//求某个数的几次幂
Math.pow( number , index );
//开n次方根
Math.pow( number , index );//1/index

数组排序

Arrays

1
2
3
4
5
6
7
import java.utils.Arrays;
Arrays.sort(数组名)//默认从小到大排序 从大到小转化为list倒叙reverse即可
//倒叙
//使用Guava的Ints.asList()方法实现
List<Integer> integersList = Ints.asList(array);
Collections.reverse(integersList);//冒泡交换
//原因:对于非引用类型,不可以使用Arrays.asList(),因为int[]会被当作一个类型,而不是数组。所以可以使用Guava的Ints.asList()方法实现

字符串操作拼接、反序、替换、删减、插入

StringBuilder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//不用导入包
//初始化
String str = "0123456";
StringBuilder sb = new StringBuilder(str);

//void append(XXX xxx)
//拼接,可接收大部分基本数据类型、String、char[]等等,甚至能接收StringBuilder。
sb.append();

//void setLength()
//清空sb
sb.setLength(0);

//void reverse()
//反转顺序
sb.reverse();

//void replace(int start, int end, String str)
//根据索引把某部分替换成其它的。
sb.replace(start, end, String);//左闭右包[start,end)

//void delete(int start, int end)
//根据索引删减某部分。
sb.delete(start, end);//左闭右包[start,end)

//void insert(int offset, XXX xxx)
//在索引位置之前插入一段。
sb.insert(3, String);

//new StringBuilder(int capacity)
//StringBuilder默认的初始容量是16,可用带参构造器来自定义初始容量。
//当字符个数达到了当前容量,则容量会自动提升,容量提升的规律为:新容量 = 旧容量 * 2 + 2。

//int capacity()
//返回当前字符序列的容量。

//int length()
//返回当前已存储的字符的个数。
sb.capacity();
sb.length();

//获取内容
char charAt(int index)//根据索引,得到相应字符。
String substring(int start)//根据索引,以字符串形式截取尾部段。
String substring(int start, int end)//根据索引,以字符串形式截取内部段。
String toString()//以字符串形式输出整段。 可以将StringBuilder转化为字符串

//返回匹配对应的索引
int indexOf(String str)//输出第一个匹配的字符串的第一个char的索引。如果没有匹配的值返回-1
int indexOf(String str, int fromIndex)//从指定的索引处开始,输出第一个匹配的索引。
int lastIndexOf(String str)//输出最后一个匹配的索引。
int lastIndexOf(String str, int fromIndex)//从指定的索引处开始,输出最后一个匹配的索引。

动态数组

ArrayList LinkList List 三者的原理以及区别:
ArrayList是基于数组实现的 LinkList是基于链表实现的

ArrayList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//导入包
import java.util.ArrayList;
// 初始化
//E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
ArrayList<E> objectName =new ArrayList<>();

//增加元素
ArrayList<String> sites = new ArrayList<String>();
sites.add("Google");

//访问元素
sites.get(1);//1为索引值 从0开始

//修改元素
sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值

//删除元素
sites.remove(3); // 删除第四个元素

//计算元素数量
sites.size()

//遍历数组
//foreach或者for(int i)+.get

//排序
import java.util.Collections; // 引入 Collections 类
Collections.sort(sites); // 字母排序 从小到大

// ...还有很多好用方法 有时间补充 isEmpty clear addAll...

LinkList

List

高精度数据处理

BigDecimal
1)参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

2)String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言, 通常建议优先使用String构造方法。

3)当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。

==4)注意:BigDecimal也封装了Math类的方法 可以直接调用==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//导入包
import java.math.BigDecimal;

//初始化
//BigDecimal类型的数可以用scanner.nextBigDecimal()读入。
//也可以使用静态的valueOf()方法将普通的数转为BigDecimal类型的数。
BigDecimal bd = BigDecimal.valueOf(long or String);
//也可以直接使用构造器new BigDecimal(String str)将str转为BigDecimal类型的数。
BigDecimal bd = new BigDecimal(long or String);

//计算
//BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。
BigDecimal add(BigDecimal val) //BigDecimal 加法
//ex
bd = bd2.add(bd3);//返回一个和大数 其余同理

BigDecimal subtract (BigDecimal val) //BigDecimal 减法
BigDecimal multiply (BigDecimal val) //BigDecimal 乘法
BigDecimal divide (BigDecimal val,2,RoundingMode mode) //除法 //其中的第二个参数表示的是:保留小数点之后多少位

//比较
int a = new bigdemical(a).compareTo(new bigdemical(b))

a = -1 //表示a小于b;
a = 0 //表示a等于b;
a = 1 //表示a大于b;


//表示保留一位小数,默认用四舍五入方式
bd.setScale(1)

//直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_DOWN)

//进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_UP)

//四舍五入,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)

//四舍五入,2.35变成2.3,如果是5则向下舍
setScale(1,BigDecimal.ROUND_HALF_DOWN)

基本数组(int string double)/二维/三维

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//数组的创建
//一、声明并赋值
int[] arr = {1,2,4, …};
//注意这里的花括号不是语句块,而且而且花括号后的分号也不能省,…不是元素意思是可以指定多个元素

//二、声明数组名开辟空间并且赋值
int[] arr;
arr = new int[]{1,2,3, …};

//三、声明数组时指定元素个数然后赋值
int[] arr1= new int[3];
//注意:最大元素下标为2,并且所有的元素值均为0
//赋值一般用for循环

//四、在以上的基础上创建多维数组
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; //每个子数组元素个数不要求均相同
int[][] arr = new int[m][n]; //其中n可以省略,在创建的时候可以指定
int[][][] arr = new int[m][n][q]; //同样其中n、q可以省略

//补充:
//.Arrays的toString方法
//作用: 将数组的元素生成字符串,数组的各个元素使用方括号括着 [ ]
//格式: Arrays.toString(数组名称)
//注意: 此方法不能用于直接获得二维数组
int[] arr = {111,222,333};
System.out.println(Arrays.toString(arr));

String的一些基本操作

String
==String数据范围==
在 Java 中,String 字符串的长度受到限制,但这个限制是由你的计算机硬件和内存资源决定的,而不是 Java 语言本身的限制。String 类使用一个 char 数组来存储字符串的字符,而 char 占用两个字节的内存。因此,String 的长度受限于可用的内存大小。

如果你的程序在内存充足的情况下运行,String 可以非常长。然而,如果你的字符串非常巨大,可能会导致内存不足异常。此外,Java 虚拟机(JVM)也可能会有一些特定的限制,但这些限制通常取决于 JVM 的实现和配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
String str = "hello world";
//求取长度(char的个数)
str.length();
//从字符串中取出指定位置的字符
str.charAt(index);
//将字符串变成一个字符数组
char c[] = str.toCharArray();
//查找一个指定的字符串是否存在,返回的是字符串的位置,如果不存在,则返回-1
//lastIndexOf(“字符”) 得到指定内容最后一次出现的下标
int index = str.indexOf("he");
//字符串大小写的转换
//不会转换数字等非字母字符
"string".toUpperCase()
"string".toLowerCase()
//根据给定的正则表达式的匹配来拆分此字符串。形成一个新的String数组。
//注意: . 、 $、 | 和 * 等转义字符,必须得加 \\。
//注意:多个分隔符,可以用 | 作为连字符。
String strArr[] = str.split(" ");
//比较两个字符串每个字符是否相等 会考虑大小写 返回一个布尔值
str.equals("string");
//忽略大小写的比较两个字符串的值是否一模一样 返回一个布尔值
str.equalsIngoreCase("string");
//去掉字符串左右空格
str.trim();
//新字符替换旧字符,也可以达到去空格的效果一种。
str.replace(" ","");//(旧字符,新字符) 全部替换
str.replaceFirst(" ","");//只替换第一个
str.replaceAll(" ","");//全部替换
//截取字符串
str.subString(start_index,end_index)//[start_index,end_index)
//判断一个字符串里面是否包含指定的内容 返回一个布尔值
str.contains("string");
//按字典序比较字符串
str.compareTo(str2);
//如果字典序:str>str2 输出正整数
// str<str2 输出负整数
// str==str2 输出0
//前提必须是全是小写字母
//测试此字符串是否以指定的前缀开始。返回一个布尔值
str.startsWith("string");
//测试此字符串是否以指定的后缀结束。返回一个布尔值
str.endsWith("string");

==对数字/字符的一些处理==

小数位数控制/保留几位小数/保留几位有效数字

1
2
3
4
5
6
7
8
9
10
//导入包
import java.math.BigDecimal;
import java.math.RoundingMode;
//初始化一个bigdecimal对象 传入构造参数为double类型
BigDecimal number = new BigDecimal("123.456789");
// 保留小数点数字的位数为两位,采用四舍五入的方式(RoundingMode.HALF_UP) 更多用法见高精度数据处理BigDecimal
// 若保留有效数字,用有效数字位数减去整数部分位数,并且去掉小数点后末尾的0
BigDecimal roundedNumber = number.setScale(2, RoundingMode.HALF_UP);
// 去掉末尾的零
BigDecimal roundedNumber2 = roundedNumber.stripTrailingZeros();

字母的大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
//变量A的值赋为'a'
char A=Character.toUpperCase('a');
//变量b的值赋为'B'
char b=Character.toLowerCase('B');
//注意:上述方法并不会判断传入字符是否为英文字符 所以在使用方法之前最好用Character.isLetter(str.charAt())进行判断
Character.isLetter(char);
//"string".toUpperCase() or "string".toLowerCase()
String cc = "aBc123".toUpperCase();
//结果就是:ABC123。

String cc = "aBc123".toLowerCase();
//结果就是:abc123。

四舍五入/向上/向下取整

1
2
3
4
5
6
7
//四舍五入
int roundNum = (int) Math.round(result);
//向上取整
int ceilNum = (int) Math.ceil(result);
//向下取整
int floorNum = (int) Math.floor(result);

Java数字、字符、字符、数组串互相转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 数字转字符串 method1
int number = 5;
String str = String.valueOf(number);
System.out.println(str);

// 数字转字符串 method2
int number = 5;
Integer itr = number; //int装箱为对象,再调用对象的toString方法
String str = itr.toString(); //或者直接 String str = Integer.toString(number);
System.out.println(str);

// 数字转字符串 method3
int number = 5;
String str = number + "";
System.out.println(str);
//str = number + "";与str = Integer.toString(number);用的比较多

//字符转字符串 method 1
char ch = '5';
String str = String.valueOf(ch);
System.out.println(str);

//字符转字符串 method 2
char ch = '5';
String str = ch + "";
System.out.println(str);

// 字符串转字符
// 其实这里也算不上转换了,只是获取对应位置上字符
String str = "123";
char ch = str.charAt(0); //这里获取到的字符为1
System.out.println(ch);


//数组转字符串
arr = [1,2,2];
str1 = arr.toString();

//字符串转数组
//split() 方法根据匹配给定的正则表达式来拆分字符串。
//注意: . 、 $、 | 和 * 等转义字符,必须得加 \\。
//注意:多个分隔符,可以用 | 作为连字符。
String strArr = str2.split("\\.")


// 字符串转数字
String str = "123";
int number = Integer.parseInt(str);
System.out.println(number);

// 数字转字符
// 不能直接转换,如下图。因此需借助数字转字符串。
// 首先将数字转为字符串,再获取字符
int number = 5; //注意这里数字只能是个位数并且不能为负
String temp = Integer.toString(number);
char ch = temp.charAt(0);
System.out.println("数字转字符:"+ch);

// 字符转数字
// 先把字符转为字符串,再转换为数字
char ch = '5';
String temp = String.valueOf(ch);
int a = Integer.parseInt(temp);
System.out.println(a);
//或者
int a = ch - '0';

//String数组 转int数组
String arr[];
int[] array = Arrays.stream(arr).mapToInt(Integer::parseInt).toArray();

约分/最大公约数/最小公倍数

1
2
3
4
5
6
7
8
9
10
11
12
13
//辗转相除法递归 返回最大公约数
//原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。并一直递归
public static int gcd(int a,int b) {
if(b == 0)return a;
else return gcd(b,a%b);
//递归思路
// 3 4
// 4 3
// 3 1
// 1 0
// 1
//两数相乘除以最小公约数即为最小公倍数
a*b/gcd(a,b);

判断字符串是否为数字

1
2
3
4
5
6
7
8
9
10
    public static boolean isNumeric1(String str) {
try {
Double.parseDouble(str);
return true;
} catch(Exception e){
return false;
}
}
//如果我们的业务只要求判断字符串是否为整数,那么只需要将Double.parseDouble(str);换成Integer.parseInt(str);即可。
//但是这个方案有个致命缺陷,由于判断失败会抛异常出来,当判断失败的频率比较高,将产生较大的性能损耗。

获取字母表数组

1
2
3
4
char[] alphabet = new char[26];
for (int i = 0; i < 26; i++) {
alphabet[i] = (char) ('a' + i);
}

判断闰年

1
2
3
4
5
//闰年定义:能被4整除但是不能被100整除 或者 能被400整除的年份
public static boolean leapYear(int year) {
if((year%4 == 0 && year%100 != 0)||year%400 == 0)return true;
else return false;
}

阶乘(factorial)

1
2
3
4
public static int factorial(int n){
if(n == 1)return 1;
else return n*factorial(n-1);
}

==数学知识==

关于质数

1>质数不可能是偶数 所以遍历质数从奇数遍历即可
质数筛

1
2
3
4
5
6
7
8
9
10
11
12
//判断一个数n是不是质数
public static boolean prime(int n) {
if( n == 2)return true;
else {
for(int i = 2;i<n;i++) {
if(n%i == 0) {
return false;
}
}
return true;
}
}

2>质因数分解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//导入包····
//将一个质数分解成两个质数相乘,这两个质数是唯一的。这个性质被称为质因数分解定理(Fundamental Theorem of Arithmetic)。
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
if(n%2 == 0) {
System.out.println(n/2);
System.exit(0);
}
for(int i = 3;i<n;i+=2) {
if(n%i == 0) {
System.out.println(n/i);
break;
}
}

哥德巴赫猜想

任一大于2的整数都可写成三个质数之和。

==基本算法==

暴力枚举

模拟

官方化的诠释则是:根据题目表述进行筛选提取关键要素,按需求书写代码解决实际问题。
==这种题型一般并不难 顺着题意解决就行 但是要注意一些特殊情况的处理 以及输出结果的要求==

高精度 (见基本模块)