【原】Java学习笔记009 - 阶段测试

 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 }

 

posted @ 2017-02-26 11:30  {name:"代码屠夫"}  阅读(273)  评论(0编辑  收藏  举报