当循环次数或范围确定时,多用for循环,反之多用while循环
循环结构一般由四部分组成:
- 初始化语句,在循环开始最初执行,并且只执行一次
- 条件判断、步进语句、循环体
for & foreach
for循环,循环体可以执行零次或多次
每执行一次循环体,就会执行一次步进语句
int i;
for (i = 0; i < 5; i++) {
continue; // 跳出当前次循环
// System.out.println(i); // 标红报错 Unreachable statement 不能执行到的语句
}
System.out.println(i); // 5
foreach循环,JDK 5 新特性,遍历数组和集合,底层是迭代器
for(声明循环变量:数组名字){ },不可以使用已经声明过的变量
int one[] = {1, 2, 50, 61};
for (int i : one) {
System.out.println(i);
}
// int j = 0;
// for ( j : one) { } // 标红报错 Not a statement
int two[][] = {{1}, {1, 2}, {1, 2, 3}};
for (int i = 0; i < two.length; i++) { // 传统方式遍历二维数组
for (int j = 0; j < two[i].length; j++) {
System.out.println(two[i][j]);
}
}
System.out.println("==========");
for (int[] ints : two) { // 改进方式遍历二维数组
for (int anInt : ints) {
System.out.println(anInt);
}
}
遍历数组,foreach循环比for循环更加快捷
for循环可以修改数组元素,foreach循环不能修改数组元素
int[] arr = {1, 2, 3};
for (int i : arr) {
i += 1;
}
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
for (int i = 0; i < arr.length; i++) {
arr[i] += 1;
}
System.out.println(Arrays.toString(arr)); // [2, 3, 4]
一、求1-100之间偶数的和
int sum = 0;
for (int i = 1; i <= 100; i1++) {
if (i1 % 2 == 0) {
sum += i;
}
}
// for (int i = 2; i <= 100; i += 2) { // 步进语句,每次加二
// sum += i;
// }
System.out.println("1-100之间偶数的和:" + sum); // 2550
二、求1-100之间素数的和
int sum = 0;
for (int i = 1; i <= 100; i++) { // 目标数
int j;
for (j = 2; j < i; j++) { // 素数只能被1和本身整除,在2~(i-1)范围内遍历
if (i % j == 0) {
break;
}
}
if (i == 1 || j < i) { // 最小的素数是2,排除目标数1;j<i不是素数,继续下一个目标数
continue;
}
sum += i;
}
System.out.println(sum); // 1060
三、求6+66+666…的前12项和
int sum = 0;
int item = 6;
for (int i = 1; i <= 2; i++) { // 检验循环,缩小次数
sum += item;
item = item * 10 + item; // 修改中间量
}
System.out.println(sum); // 72
四、求1-1000之内的所有完数
一个数恰好等于它的因子之和,这个数称为完数
for (int i = 1; i <= 1000; i++) { // 目标数
int sum = 0;
for (int j = 1; j < i; j++) { // 因子,不包含本身
if (i % j == 0) {
sum += j;
}
}
if (i == sum) {
System.out.println(i); // 6 28 496
}
}
五、打印一天之内的几点几分
// 嵌套循环
for (int i = 0; i < 24; i++) { // 24小时
for (int j = 0; j < 60; j++) { // 60分钟
System.out.println(i + "点" + j + "分"); // 24*60=1440行
}
}
while & do-while
while循环,循环体可以执行零次或多次
do-while循环,循环体至少执行一次,不要漏掉末尾的分号!!
int i = 1; // 初始化语句
do {
System.out.println("hello world " + i); // 循环体
i++; // 步进语句
} while (i < 0); // 条件判断
一、求1!+1/2!+1/3!+…的前12项和
double sum = 0; // double类型
double item = 1;
int index = 1, end = 2; // 检验循环,缩小次数
while (index <= end) {
sum += item;
index++;
item = item * 1.0 / index; // 修改中间量
}
System.out.println(sum); // 1.5
二、求1!+2!+3!+4!+…的前12项和
int sum = 0;
int item = 1;
int index = 1, end = 3; // 检验循环,缩小次数
while (index <= end) {
sum += item;
index++;
item = item * index; // 修改中间量
}
System.out.println(sum); // 1 + 2 + 6 = 9
三、求满足1+2+3+…+n<8888的最大正整数n
// 0<8888 +1<8888 +2 +3 +4
// sum: +1 +2 +3 +4
// item: 2 3 4 5
int sum = 0;
int item = 1;
while (sum < 8888) { // 数字10验证过程如上,最终需要item-2才正确
sum += item;
item = item + 1;
}
System.out.println(item - 2); // 132