【213天】黑马程序员27天视频学习笔记【Day23-下】
叨逼叨两句
- 插。。没办成。又得等。
- 累死了。
23-04:按层级打印
- 注意那个lev的小细节
package com.test.demo001;
import java.io.File;
import java.util.Scanner;
/**
* @author wangtao
* 1. 获取所有文件和文件夹,返回File数组。
* 2. 遍历该数组。
* 3. 无论是文件还是文件夹都直接打印。
* 4. 如果是文件夹,递归调用。
*/
public class Demo013 {
public static void main(String[] args) {
File dir = getDir();
printLev(dir,0);
}
public static void printLev(File dir,int lev) {
File[] subFiles = dir.listFiles();
for (File subFile : subFiles) {
for(int i = 0;i <= lev;i++){
System.out.print("\t");
}
System.out.println(subFile);
if(subFile.isDirectory()){
printLev(subFile,lev + 1); //此处不能使用lev++和++lev,他们都会改变lev的值
}
}
}
public static File getDir(){
//1. 创建键盘录入对象
Scanner sc = new Scanner(System.in);
//2. 定义一个无限循环
while(true){
System.out.println("请输入文件夹路径:");
String line = sc.nextLine();
//3. 将键盘录入的结果存储在字符串中,并封装成File对象
File file = new File(line);
//4. 对File对象做判断
if(!file.exists()){
System.out.println("该文件夹不存在,请重新输入");
}else if(file.isFile()){
System.out.println("您输入的是文件路径,请输入文件夹路径");
}else{
//5. 将文件夹路径对象返回
return file;
}
}
}
}
23-05:斐波那契数列的两种算法
-
数组
package com.test.demo001; public class Demo014 { public static void main(String[] args) { //数组形式 int[] arr = new int[8]; arr[0] = 1; arr[1] = 1; for(int i = 2;i < arr.length;i++){ arr[i] = arr[i - 2] + arr[i - 1]; } System.out.println(arr[arr.length-1]); } }
-
递归
package com.test.demo001; public class Demo014 { public static void main(String[] args) { System.out.println(get(8)); } public static int get(int num){ if(num == 1 || num == 2){ return 1; }else{ return get(num - 2) + get(num -1); } } }
23-06:1000的阶乘所有零和尾部零的个数
-
以下方式求阶乘超表数范围
package com.test.demo001; public class Demo014 { public static void main(String[] args) { int result = 1; for(int i = 1;i <= 1000;i++){ result = result * i; } System.out.println(result);//超出int类型的表数范围了 } }
-
求1000阶乘结果中有多少个零
package com.test.demo001; import java.math.BigInteger; public class Demo014 { public static void main(String[] args) { BigInteger bi1 = new BigInteger("1"); for(int i = 1;i <= 1000;i++){ BigInteger bi2 = new BigInteger(i + ""); bi1 = bi1.multiply(bi2); } System.out.println(bi1); int count = 0; String str = bi1.toString(); for(int i = 0;i < str.length();i++){ if('0' == str.charAt(i)){ count++; } } System.out.println(count); } }
-
求1000阶乘结果尾部有多少个零
package com.test.demo001; import java.math.BigInteger; public class Demo014 { public static void main(String[] args) { BigInteger bi1 = new BigInteger("1"); for(int i = 1;i <= 1000;i++){ BigInteger bi2 = new BigInteger(i + ""); bi1 = bi1.multiply(bi2); } System.out.println(bi1); int count = 0; String str = bi1.toString(); for(int i = str.length()-1; i >= 0; i--){ if('0'==str.charAt(i)){ count++; } else { break; } } System.out.println(count); } }
23-07:使用递归求1000阶乘尾部零的个数
- 逢5的倍数至少得一个零
- 逢5*5的倍数至少得两个零
- 逢
5*5*5
的倍数至少是三个零 - 逢
5*5*5*5
的倍数至少是四个零 - 具体见视频【23-07】
23-08:约瑟夫环
- i--那要注意
- count用来做为计数其
- i用来作为索引(指针)
package com.test.demo001;
import java.util.ArrayList;
public class Demo014 {
public static void main(String[] args) {
}
public static int getLucklyNum(int num){
ArrayList<Integer> list = new ArrayList<>();
for(int i = 1;i <= num;i++){
list.add(i);
}
int count = 1;
for(int i = 0; list.size()!= 1; i++) {
if(i == list.size()){
i = 0;
}
if(count % 3 ==0){
list.remove(i--); //这个i--要注意!
}
count++;
}
return list.get(0);
}
}