1、循环结构★
概念:重复性操作
语法:
for(1;2;3){
4
}
for(循环变量声明和初始化;循环条件;循环变量的变化){
循环体(语句块);
}
循环变量声明和初始化;
while(循环条件){
循环变量的变化;【注意】
循环体(语句块);
循环变量的变化;【注意】
}
/**
1、循环变量声明和初始化 数字变量int i,初始化0,1; N
2、循环条件 i<[=]N;i>=0,1
3、循环变量的变化 i++,i+=N,i--,i-=x
4、循环体(语句块) 根据经验找【规律】
*/
/**
使用循环解决问题的步骤
1、审题确认重复是否存在(经验:唯有练习)
2、设计四要素并套用循环语法
3、检查循环是否正常结束
*/
循环跳转语句:
break:终止循环
continue:终止本轮循环,进入下一轮
求水仙花数
1、使用while循环 解决循环次数不固定的 顺序执行
public static void main(String[] args) {
final int UNIT = 10;
int num = 153,copy = num,sum = 0;
while (copy>=1){
sum += Math.pow(copy%UNIT,3);
copy /= 10;
}
System.out.println(num+(num == sum ? "是":"非")+"水仙花数");
}
2、使用for循环 一般用来解决四要素明确且循环次数固定的循环
(先执行循环体,再执行循环变量的变化1->2->4->3->2->4->3往复,一直到条件2不成立)
int num = 153,copy = num,sum = 0;
for(int copy=num;copy>=1;copy/=UNIT){
sum += Math.pow(copy%UNIT, 3);
}
素数(质数)
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
验证2到100以内任意一数是否为素数
public static void main(String[] args) {
Random rand = new Random();
int num = 2+rand.nextInt(99);
boolean is = true; //假设它是
for (int i =2; i <num ; i++) { //定义i在里面声明,出了就没了,要在外声明提升作用域
if(num%i == 0){
is =false;
break;
}
}
System.out.println(num+(is ? "是":"非")+"质数");
}
不用布尔值来确定,可以用 i 的值来确定
public static void main(String[] args) {
Random rand = new Random();
int num = 2+rand.nextInt(99);
//循环正常结束的条件是它没有被余等于0 因为质数成立的条件就是不能被1和它之外的数整除
//i在括号内声明,只能在循环中使用,出去就没了,所以此时要提升它的作用域
for (int i=2; i <num ; i++) { //循环正常结束时是i的值number
if(num%i == 0){
break;
}
}
System.out.println(num+(i==num ? "是":"非")+"质数");
//此时i会报红,因为i的作用域仅在for内,这句话的作用域在下面的大{}内
}
public static void main(String[] args) {
Random rand = new Random();
int num = 2+rand.nextInt(99),i = 1;
for (; i <num ; i++) { //在里面声明,出了就没了,要在外声明提升作用域
if(num%i == 0){
break;
}
}
System.out.println(num+(i==num ? "是":"非")+"质数");
}
如果不需要通过循环就能证明它是质数,效率更高。 (2是最小的质数)
public static void main(String[] args) {
Random rand = new Random();
int num = 2+rand.nextInt(99);
boolean is = true;
if(num != 2 && num%2 ==0){ //不是2的偶数,一定不是质数
is = false;
}else{ //else要么是2,要么是奇数。再排除2假设它是奇数
int i = 3;
for(;i<=num;i+=2){
if(num%i ==0){
break;
}
}
is = i==num; //i==num这个关系表达式决定了is的布尔值
}
System.out.println(num+(is ? "是":"非")+"质数");
}
继续优化
//上述num验证只要到它一半就行了,因为一个数不能被大于它一半的值整除 ,只有偶数才会有一半,上述只有奇数,所以验证范围为i<num/2即可
继续优化
//其实只要验证到它的二次方根以内的质数就可以了
public static void main(String[] args) {
Random rand = new Random();
int num = 2+rand.nextInt(99);
boolean is = true;
if(num != 2 && num%2 ==0){ //不是2的偶数,一定不是质数
is = false;
}else if (num !=2){ //要么是2,要么是奇数。再排除2假设它是奇数
int i = 3, U=(int)Math.sqrt(num); //i全是奇数,但是开根之后有可能是偶数
for(;i<=U;i+=2){ //
if(num%i ==0){
break;
}
}
is = i==U+(U%2==0 ? 1:2); //偶数+1就是奇数
}
System.out.println(num+(is ? "是":"非")+"质数");
}
求1~1000之间不被7整除的数值之和
public static void main(String[] args) {
final int BEGIN = 1,END = 1000,EXCEPT = 7;
int sum = 0;
for (int i = BEGIN; i < END; i++) {
if (i%EXCEPT==0){
continue; //contnue完了到for这一步
}
sum += i;
}
System.out.println(sum);
}
从1开始累加排除不能被7整除的数值之和,求当和达到5000时,i的值是多少
public static void main(String[] args) {
final int BEGIN = 1,END = 1000,EXCEPT = 7,LIMIT=5000;
int sum = 0,i = BEGIN;
for (; i < END; i++) {
if (i%EXCEPT==0){
continue;
}
sum += i;
if (sum>=LIMIT){
break;
}
}
System.out.println(sum+","+i);
}
//如果没有break,注意最后i-1
public static void main(String[] args) {
final int BEGIN = 1,EXCEPT = 7,LIMIT=5000;
int sum = 0,i = BEGIN;
for (; sum < LIMIT; i++) {
if (i%EXCEPT==0){
continue;
}
sum += i;
/*if (sum>=LIMIT){
break;
}*/
}
System.out.println(sum+","+(i-1));
}