1 package cn.temptation;
2
3 public class Sample01 {
4 public static void main(String[] args) {
5 // 需求:写一万次"我错了!"
6
7 // 方式1、使用CV大法
8 System.out.println("我错了!");
9 System.out.println("我错了!");
10 System.out.println("我错了!");
11 System.out.println("我错了!");
12 // ...
13
14 // 方式2、机械的重复的动作,很傻,考虑让计算机去做,引入了循环的概念
15 // 循环怎么理解?
16 // 循:按照一定的规律
17 // 环:闭合的圆,重复的
18
19 // 循环的形式:
20 /*
21 * 1、while循环
22 * 2、do...while循环
23 * 3、for循环
24 */
25 }
26 }
1 package cn.temptation;
2
3 public class Sample02 {
4 public static void main(String[] args) {
5 // while循环(当型循环)
6
7 /*
8 * while(条件) { ... }
9 * 当条件满足时,一直做某事,直到条件不满足为止
10 *
11 * while结构中的 { ... } 包含的内容称为循环体
12 */
13
14 // 需求:打印显示"我错了!"这句话3遍
15 // 定义次数变量
16 int count = 0;
17
18 while (count < 3) {
19 // 做打印显示的事情
20 System.out.println("我错了!");
21
22 // 对次数进行统计(即做了一次打印显示,就让次数加1)
23 // count = count + 1;
24 // count += 1;
25 // count++;
26 ++count;
27
28 System.out.println("当前为第" + count + "次");
29 }
30 }
31 }
1 package cn.temptation;
2
3 public class Sample03 {
4 public static void main(String[] args) {
5 // 需求:使用while循环输出10以内的奇数:1、3、5、7、9
6 int i = 1;
7
8 // 写法1、考虑连续的奇数之间的间隔为2
9 // while (i < 10) {
10 // System.out.println(i);
11 //// i = i + 2;
12 //// i += 2;
13 //
14 // // Invalid argument to operation ++/--
15 //// i++++;
16 //// (i++)++;
17 //
18 // // 非要使用自增
19 // i++;
20 // i++;
21 // }
22
23 // 写法2、考虑在while循环中使用自增,但是只对那些和2求余数为1的数字才显示出来
24 while (i < 10) {
25 // 结合选择结构
26 // 判断是否为和2求余数为1的数字
27 if (i % 2 == 1) {
28 System.out.println(i);
29 }
30
31 i++;
32 }
33 }
34 }
1 package cn.temptation;
2
3 public class Sample04 {
4 public static void main(String[] args) {
5 // 需求:计算从1+2+3+...+100的和
6 int i = 1;
7 int result = 0;
8
9 // 分步来看1+2+3+...+100这个加法算式
10 // result += 1;
11 // result += 2;
12 // // ...
13 // result += 100;
14
15 // 因为有一定的规律,且重复的在操作,所以考虑使用循环
16 while (i <= 100) {
17 System.out.println(i);
18
19 result += i;
20
21 // i每次加法操作后都要做一下自增
22 i++;
23 }
24
25 System.out.println("1+2+3+...+100的总和为:" + result);
26 }
27 }
1 package cn.temptation;
2
3 public class Sample05 {
4 public static void main(String[] args) {
5 // 需求:世界最高峰珠穆朗玛峰有8848米,现在有一张很大很大的纸,纸的厚度为0.001米,折叠多少次后可以超过珠峰的高度?
6
7 // 思路:纸每次折叠,厚度都会是上一次厚度的2倍
8
9 // 纸的初始厚度
10 int height = 1;
11 // 折叠次数
12 int count = 0;
13
14 while (height <= 8848000) {
15 // 纸每次折叠,厚度都会是上一次厚度的2倍
16 height = height * 2;
17
18 // 折叠一次,折叠次数加1
19 count++;
20 }
21
22 System.out.println("折叠了" + count + "次后,就会超过珠峰的高度");
23 }
24 }
1 package cn.temptation;
2
3 public class Sample06 {
4 public static void main(String[] args) {
5 // 需求:存折中现在有1000块钱,银行的年利息为3.5%,问在银行里放多少年后,连本带利能翻倍?
6
7 // 定义存折的金额
8 double cash = 1000.00;
9 // 定义目标金额
10 double total = cash * 2;
11 // 定义年数
12 int year = 0;
13
14 while (cash < total) {
15 // 本金和利息记为后一年的本金
16 cash = (1 + 0.035) * cash;
17
18 year++;
19 }
20
21 System.out.println("在银行里放" + year + "年后,连本带利能翻倍");
22 }
23 }
1 package cn.temptation;
2
3 public class Sample07 {
4 public static void main(String[] args) {
5 // while循环的要点:条件放上头,控制里面走
6 int i = 1;
7
8 while (i < 5) {
9 i++; // 显示:2、3、4、5
10 System.out.println(i);
11 // i++; // 显示:1、2、3、4
12 }
13
14 // 循环编写时,特别要注意循(按照一定的规律)的规律的归纳总结,这是写好循环的关键
15 }
16 }
1 package cn.temptation;
2
3 public class Sample08 {
4 public static void main(String[] args) {
5 // 需求:统计100 ~ 999之间的水仙花数并计算有多少个?
6
7 // 规则:以三位数字为例,数字的值 = (百位上的数字 * 百位上的数字 * 百位上的数字)
8 // + (十位上的数字 * 十位上的数字 * 十位上的数字)
9 // + (个位上的数字 * 个位上的数字 * 个位上的数字),则称为是一个水仙花数
10 // 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3
11
12 // 定义数字变量并赋值
13 int number = 100;
14 // 定义统计个数用的变量
15 int count = 0;
16
17 while (number <= 999) {
18 // 关键点:如何获取百位上的数字、十位上的数字、个位上的数字?
19 // 个位上的数字
20 int i = number / 1 % 10;
21 // 十位上的数字
22 int j = number / 10 % 10;
23 // 百位上的数字
24 int k = number / 100 % 10;
25
26 // 根据上面的分析,得到通用的公式,注意求余的10表示的是十进制的含义
27
28 // 规则:以三位数字为例,数字的值 = (百位上的数字 * 百位上的数字 * 百位上的数字)
29 // + (十位上的数字 * 十位上的数字 * 十位上的数字)
30 // + (个位上的数字 * 个位上的数字 * 个位上的数字),则称为是一个水仙花数
31 // 结合选择结构进行判定
32 if (number == i * i * i + j * j * j + k * k *k) {
33 System.out.println(number);
34 // 统计用的变量需要自增
35 count++;
36 }
37
38 // 统计的范围从100~999,所以数字需要自增
39 number++;
40 }
41
42 System.out.println("【100~999】之间的水仙花数有:" + count + "个");
43 }
44 }
1 package cn.temptation;
2
3 public class Sample09 {
4 public static void main(String[] args) {
5 // 需求:大蜀山上有一段台阶,级数不知道,但是知道如果两个台阶一起跨,还剩1个台阶;
6 // 如果三个台阶一起跨,还剩2个台阶;如果四个台阶一起跨,还剩3个台阶;
7 // 如果五个台阶一起跨,还剩4个台阶;如果六个台阶一起跨,还剩5个台阶;
8 // 如果七个台阶一起跨,一个台阶都不剩。
9 // 问:这段台阶最少有多少级?
10
11 // 定义台阶变量
12 int step = 1;
13
14 // 思路:运用穷举思想,一个数字一个数字的来尝试是否满足规则
15
16 // 写法1、当台阶数不满足规则的,需要做自增;当找到第1个满足规则的台阶数时,就是最少的满足规则的台阶级数,不用自增了
17 // while (!((step % 2 == 1) && (step % 3 == 2) && (step % 4 == 3) && (step % 5 == 4) && (step % 6 == 5) && (step % 7 == 0))) {
18 // step++;
19 // }
20 //
21 // System.out.println("这段台阶最少有" + step + "级");
22
23 // 写法2、构造一个死循环,不断的做自增,在循环体中判断是否满足规则,当找到第1个满足规则的数字时,终止循环跳出
24 // while死循环的结构
25 // while (true) {
26 // System.out.println("死循环了么?");
27 // }
28
29 boolean flag = true;
30 while (flag) {
31 // 对台阶级数进行规则判断
32 if ((step % 2 == 1) && (step % 3 == 2) && (step % 4 == 3) && (step % 5 == 4) && (step % 6 == 5) && (step % 7 == 0)) {
33 System.out.println("这段台阶最少有" + step + "级");
34 flag = false;
35 }
36
37 step++;
38 }
39 }
40 }
1 package cn.temptation;
2
3 public class Sample10 {
4 public static void main(String[] args) {
5 // 需求:百钱百鸡问题:母鸡一只5元,公鸡一只3元,小鸡三只1元,有100元,如何买到100只鸡?母鸡多少只?公鸡多少只?小鸡多少只?(母鸡、公鸡、小鸡都有)
6
7 // 思路:
8 // 从需求中得到一些等式
9 // 母鸡数量 + 公鸡数量 + 小鸡数量 = 100
10 // 母鸡单价 * 母鸡数量 + 公鸡单价 * 公鸡数量 + 小鸡单价 * 小鸡数量 = 100
11 // 小鸡数量是3的倍数
12
13 // 运用"穷举法"
14 // 如果买1只母鸡,再买1只公鸡,还能买多少只小鸡
15 // 如果买1只母鸡,再买2只公鸡,还能买多少只小鸡
16 // ...
17 // 如果买2只母鸡,再买1只公鸡,还能买多少只小鸡
18 // 如果买2只母鸡,再买2只公鸡,还能买多少只小鸡
19 // ...
20
21 // 母鸡数量
22 int i = 0;
23 // 公鸡数量
24 int j = 0;
25 // 小鸡数量
26 int k = 0;
27
28 System.out.println("计算百钱百鸡问题的结果:");
29
30 // while循环的嵌套
31 // 注意:使用while循环的嵌套时,格外要注意内层while循环的循环条件;同时也要考虑到while循环的执行效率
32
33 // 下句语句其实效率不高,可以改进
34 // while (i < 100) { // 统计买母鸡的只数
35 while (i < 20) { // 统计买母鸡的只数
36 // 注意:必须在后一次的内层循环之前,把变量j的值重新赋值一下,否则这个变量j的值还是上一次内层循环结束时得到的那个值
37 j = 0;
38
39 // 下句语句其实效率不高,可以改进
40 // while (j < 100) { // 统计买公鸡的只数
41 while (j < 33) { // 统计买公鸡的只数
42 // 可以根据母鸡数量 和 公鸡数量 就可以得到小鸡数量
43 k = 100 - i - j;
44
45 // 根据思路分析中列出的等式
46 if ((5 * i + 3 * j + k / 3 == 100) && (k % 3 == 0) && (i != 0) && (j != 0) && (k != 0)) {
47 System.out.println("母鸡为:" + i + "只,公鸡为:" + j + "只,小鸡为:" + k + "只");
48 }
49
50 j++;
51 }
52 i++;
53 }
54
55 }
56 }
1 package cn.temptation;
2
3 public class Sample11 {
4 public static void main(String[] args) {
5 // do...while循环(直到型循环)
6 // 格式:
7 // do {
8 // System.out.println("直到型循环");
9 // } while (condition);
10
11 int i = 1;
12
13 // do {
14 // System.out.println(i);
15 // i++;
16 // } while (i < 4);
17
18 // while循环 和 do...while循环的区别:
19 // 1、可以设置断点,结合调试分析
20 // while循环的条件写在最上面,一上来就先判断条件是否满足,满足了才会进入循环体执行语句
21 // do...while循环的条件写在最后,一上来就先进入循环体并执行循环体中的语句,再判断循环条件是否满足,满足的话继续循环
22 // 注意:do...while循环在相同的条件(condition)不成立的情况下会比while循环多执行一次
23 // 2、while结构就是一个语句块;do...while结构后必须要有一个分号,否则就产生语法错误
24
25 // do...while循环在相同的条件(condition)成立的情况下和while循环的执行次数相同
26 while (i < 3) {
27 System.out.println(i);
28 i++;
29 }
30
31 do {
32 System.out.println(i);
33 i++;
34 } while (i < 3);
35
36 // do...while循环在相同的条件(condition)不成立的情况下会比while循环多执行一次
37 while (i < 1) {
38 System.out.println(i);
39 i++;
40 }
41
42 do {
43 System.out.println(i);
44 i++;
45 } while (i < 1);
46 }
47 }
1 package cn.temptation;
2
3 public class Sample12 {
4 public static void main(String[] args) {
5 // 需求:使用do...while循环输出1~100之间的数字
6 // 需求:使用do...while循环计算1+2+...+100和
7 int i = 1;
8
9 do {
10 System.out.println(i);
11 i++;
12 } while (i <= 100);
13
14 // 因为此时i == 101,所以需要把i进行重置
15 i = 1;
16 int sum = 0;
17
18 do {
19 sum += i;
20 i++;
21 } while (i <= 100);
22
23 System.out.println("1+2+...+100=" + sum);
24 }
25 }
1 package cn.temptation;
2
3 public class Sample13 {
4 public static void main(String[] args) {
5 // 需求:使用do...while循环列出1~100之间所有的奇数
6 int i = 1;
7
8 // 写法1、奇数的间隔为2
9 // do {
10 // System.out.println(i);
11 // i += 2;
12 // } while (i <= 100);
13
14 // 写法2、奇数是和2求余数为1的数字
15 do {
16 if (i % 2 == 1) {
17 System.out.println(i);
18 }
19
20 i++;
21 } while (i <= 100);
22 }
23 }