1 package cn.temptation;
2
3 public class Sample01 {
4 public static void main(String[] args) {
5 // 1、需求:打印如下图形
6 /*
7 * * *
8 * * *
9 * * *
10 * * *
11 * *
12 * * *
13 * * *
14 * * *
15 * * *
16 */
17
18 // 打印上部
19 for (int i = 0; i < 5; i++) {
20 // 打印空格
21 for (int j = 0; j < i; j++) {
22 System.out.print(" ");
23 }
24
25 // 打印星号
26 System.out.print("*");
27
28 // 打印空格
29 for (int j = 0; j < 7 - i * 2; j++) {
30 System.out.print(" ");
31 }
32
33 // 打印星号
34 if (i != 4) { // 第5行时不打印后面的星号
35 System.out.print("*");
36 }
37
38 // 换行
39 System.out.println();
40 }
41
42 // 打印下部
43 for (int i = 0; i < 4; i++) {
44 // 打印空格
45 for (int j = 0; j < 3 - i; j++) {
46 System.out.print(" ");
47 }
48
49 // 打印星号
50 System.out.print("*");
51
52 // 打印空格
53 for (int j = 0; j < i * 2 + 1; j++) {
54 System.out.print(" ");
55 }
56
57 // 打印星号
58 System.out.print("*");
59
60 // 换行
61 System.out.println();
62 }
63 }
64 }
1 package cn.temptation;
2
3 public class Sample02 {
4 public static void main(String[] args) {
5 // 2、需求:猴子第一天早上摘下若干个桃子,当即吃了一半,觉得不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
6 // 以后每天早上都多吃了前一天的一半零一个。到第10天早上再吃时,发现就剩下一个桃子了。求第一天共摘了多少个桃子。
7
8 // 思路:正向思维比较复杂时,可以考虑逆向思维,把第10天看成逆向的第1天,第9天看成逆向的第2天,...
9
10 int count = 1;
11
12 for (int i = 2; i <= 10; i++) {
13 count = (count + 1) * 2;
14 }
15
16 System.out.println("第一天共摘了" + count + "个桃子");
17 }
18 }
1 package cn.temptation;
2
3 public class Sample03 {
4 public static void main(String[] args) {
5 // 3、需求:商店里篮球原价为78元一个,现在为了促销,推出了买5个送1个的活动,波波维奇需要35个球,问他需要花多少钱?
6
7 // 单价
8 int price = 78;
9 // 购买的篮球数
10 int number = 1;
11 // 赠送的篮球数
12 int extendNumber = 0;
13 // 需求的篮球数
14 int totalNumber = 35;
15
16 for(;;) {
17 // 买5个送1个,赠送的数量加在赠送的篮球数的变量上
18 if (number % 5 == 0) {
19 extendNumber++;
20 }
21
22 // 购买的篮球数量 + 赠送的篮球数量 达到 需要的篮球数量,就跳出这个死循环
23 if (number + extendNumber >= totalNumber) {
24 break;
25 }
26
27 number++;
28 }
29
30 System.out.println("波波维奇需要35个球,问他需要花" + (number * price) + "元");
31 }
32 }
1 package cn.temptation;
2
3 public class Sample04 {
4 public static void main(String[] args) {
5 // 4、需求:网红开网店,工作日营业,休息日出去玩。工作日每天随机得到150~200元,休息日每天随机花费100~150元,问需要经过多少天,她才能存到5201314元
6 // (假设她是从某一个周一开始计算)
7 // 提示:随机数使用Math.random()方法
8
9 // 思路:
10 // 最终存下来的钱 = 赚的钱 - 花的钱
11 // (工作日) (休息日)
12
13 // 1、研究随机数的产生
14 // Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
15 // 常用的成员方法:
16 // static double random() :返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
17 // System.out.println(Math.random());
18 // 150 ~ 200 -----> 150 + 0 ~ 150 + 50 -----> 150 + Math.random() * 50
19 // 100 ~ 150 -----> 100 + 0 ~ 100 + 50 -----> 100 + Math.random() * 50
20 // System.out.println((int)(150 + Math.random() * 50));
21 // System.out.println((int)(100 + Math.random() * 50));
22
23 // 2、根据赚钱 和 花钱 的规则,明显要使用选择结构
24
25 // 3、研究工作日 和 休息日的判定
26 // 可以类比使用 %10 获取个位数字(因为那是十进制),这里一周七天(理解为七进制),所以可以通过 %7 获取是星期几
27
28 // 定义天数
29 int day = 1;
30 // 定义存的钱数
31 int totalMoney = 0;
32
33 for(;;) {
34 // 随机賺的钱
35 int earnMoney = (int)(150 + Math.random() * 50);
36 // 随机花的钱
37 int payMoney = (int)(100 + Math.random() * 50);
38
39 // 工作日 和 休息日 的业务逻辑
40 switch (day % 7) {
41 case 1:
42 case 2:
43 case 3:
44 case 4:
45 case 5:
46 // 工作日
47 totalMoney += earnMoney;
48 break;
49 case 6:
50 case 0:
51 totalMoney -= payMoney;
52 break;
53 default:
54 System.out.println("输入错误");
55 break;
56 }
57
58 // 跳出死循环的条件
59 if (totalMoney >= 5201314) {
60 break;
61 }
62
63 // 用时的天数需要自增
64 day++;
65 }
66
67 System.out.println("需要经过" + day + "天,她才能存到5201314元");
68 }
69 }
1 package cn.temptation;
2
3 import java.util.Scanner;
4
5 public class Sample05 {
6 public static void main(String[] args) {
7 // 5、需求:输入两个正整数,求其最大公约数 和 最小公倍数
8
9 // 思路:
10 // 最大公约数
11 // 1、对输入的两个正整数进行大小比较
12 // 2、用比较大的数除以比较小的数,如果两个数一样大,那么最大公约数就是其本身;
13 // 如果较大的数正好可以整除较小的数,那么最大公约数就是较小的数;
14 // 如果较大的数不能整除较小的数,将得到的余数作为新的较小的数,刚才的较小的数作为较大的数再去做除法,直到得到的余数为0为止
15
16 // 最小公倍数:两个数的乘积除以最大公约数
17
18 Scanner input = new Scanner(System.in);
19 System.out.println("输入第一个数:");
20 int i = input.nextInt();
21 System.out.println("输入第二个数:");
22 int j = input.nextInt();
23 input.close();
24
25 // 声明最大公约数
26 int gcd = 0;
27
28 // 获取两个数的乘积(为了后续求最小公倍数时使用,否则后续这两个数字在循环中会发生改变)
29 int result = i * j;
30
31 // 求最大公约数
32 // 1、对输入的两个正整数进行大小比较
33 if (i < j) {
34 int temp = i;
35 i = j;
36 j = temp;
37 }
38
39 // 2、用比较大的数除以比较小的数,如果两个数一样大,那么最大公约数就是其本身;
40 // 如果较大的数正好可以整除较小的数,那么最大公约数就是较小的数;
41 // 如果较大的数不能整除较小的数,将得到的余数作为新的较小的数,刚才的较小的数作为较大的数再去做除法,直到得到的余数为0为止
42 // 注意:数学算式上 被除数 % 除数 = 商......余数
43
44 while (j != 0) {
45 if (i == j) {
46 gcd = i = j;
47 } else {
48 // 对于当次循环操作,被除数 % 除数
49 gcd = i % j;
50 // 下面两句实际上是为下次循环的操作来做准备的,即这次循环中的除数移到被除数的位置、余数移到除数的位置
51 i = j;
52 j = gcd;
53 }
54 }
55
56 // 循环结束时,就是余数为0时,最大公约数不是放在gcd这个变量中的,而是在i这个变量中
57 gcd = i;
58 System.out.println("最大公约数为:" + gcd);
59
60 System.out.println("最小公倍数为:" + result / gcd);
61 }
62 }
1 package cn.temptation;
2
3 import java.util.Scanner;
4
5 public class Sample06 {
6 public static void main(String[] args) {
7 // 6、需求:编写程序,实现Fibonacci数列的求解
8 // 提示:Fibonacci数列 1、1、2、3、5、8、13、21、...
9
10 // 思路:分析规律
11 // Fibonacci数列:第1项 和 第2项均为1;从第3项开始,值等于前面两项的和
12
13 // 写法1、常规写法(使用循环)
14 // 第3项 = 第2项 + 第1项
15 // 第4项 = 第3项 + 第2项 = (第2项 + 第1项) + 第2项
16 // 第5项 = 第4项 + 第3项 = ((第2项 + 第1项) + 第2项) + (第2项 + 第1项)
17
18 // 写法2、使用递归
19 // 递归:方法调用自身的写法称为递归
20 // 从数学角度归纳公式
21 // F(1) = 1
22 // F(2) = 1
23 // F(n) = F(n - 1) + F(n - 2) (n > 2)
24
25 // F(n) = F(n - 1) + F(n - 2) -----> F(n - 1) = F(n - 1 - 1) + F(n - 1 - 2), F(n - 2) = F(n - 2 - 1) + F(n - 2 - 2)
26 // ....... -----> F(3) = F(2) + F(1) = 1 + 1
27
28 // 逆向思考一下
29 // 位置 第一个位置 第二个位置
30 // F(3) F(2) + F(1)
31 // F(4) F(3) + F(2)
32
33 Scanner input = new Scanner(System.in);
34 System.out.println("输入项数:");
35 int n = input.nextInt();
36 input.close();
37
38 System.out.println("该项的值为:" + Fibonacci(n));
39
40 // printFibonacci(n);
41
42 System.out.println("该项的值为:" + FibonacciEx(n));
43 }
44
45 /**
46 * 写法1、常规写法(使用循环)
47 * 获取Fibonacci数列指定项的值
48 * @param n:指定项数
49 * @return:Fibonacci数列指定项对应的值
50 */
51 public static int Fibonacci(int n) {
52 // 第1项
53 int i = 1;
54 // 第2项
55 int j = 1;
56 // 定义当次结果
57 int tempResult = 0;
58 // 定义最终结果
59 int result = 0;
60
61 if (n <= 2 && n > 0) {
62 result = i = j = 1;
63 } else {
64 // 使用循环来实现
65 for (int k = 3; k <= n; k++) {
66 // 计算出当次结果
67 tempResult = i + j;
68 // 为了给下一次循环使用,调整一下i位置上 和 j位置上的值
69 j = i;
70 i = tempResult;
71 }
72
73 result = tempResult;
74 }
75
76 return result;
77 }
78
79 /**
80 * 写法1、常规写法(使用循环)
81 * 打印Fibonacci数列的指定项之前所有的值
82 * @param n
83 */
84 public static void printFibonacci(int n) {
85 // 第1项
86 int i = 1;
87 // 第2项
88 int j = 1;
89 // 定义当次结果
90 int tempResult = 0;
91
92 // 使用循环来实现
93 for (int k = 1; k <= n; k++) {
94 if (k <= 2 && k > 0) {
95 tempResult = i = j = 1;
96 System.out.print(tempResult + "\t");
97 } else {
98 // 计算出当次结果
99 tempResult = i + j;
100 System.out.print(tempResult + "\t");
101 // 为了给下一次循环使用,调整一下i位置上 和 j位置上的值
102 j = i;
103 i = tempResult;
104 }
105 }
106 }
107
108 /**
109 * 写法2、创建递归方法
110 * @param n
111 * @return
112 */
113 public static int FibonacciEx(int n) {
114 // 声明最终结果
115 int result = 0;
116
117 if (n <= 2 && n > 0) {
118 result = 1;
119 } else {
120 result = FibonacciEx(n - 1) + FibonacciEx(n - 2);
121 }
122
123 return result;
124 }
125 }