『零基础学Java语言-浙江大学-翁恺』第4周 循环控制

以下为个人学习笔记和习题整理
课程:零基础学Java语言-浙江大学-翁恺 @ 中国大学MOOC
https://www.icourse163.org/course/ZJU-1001541001

文章目录

  • 笔记
    • for 循环
    • 循环控制 break vs continue
      • 嵌套循环
    • 逻辑运算
      • 逻辑类型 boolean
      • 逻辑运算符 ! && ||
        • 运算符优先级总结
      • 逻辑表达式
    • 循环的应用
      • 求和
      • 求最大公约数
      • 整数分解
  • 编程题
    • 题目1. 素数和(5分)
      • 解题代码
    • 题目2. 念整数(5分)
      • 解题代码

笔记

for 循环

for(初始化;条件;单步动作) {
}
  • 初始化:可以定义一个新变量并赋值,如int i = 0,或者直接赋值循环外已定义的变量i = 0
  • 条件:维持循环的条件,与while条件相同。常用i<=n
  • 单步动作:步进,即每轮循环体执行完之后,必须执行的动作。可以用,连接多个动作。常用i++i--
  • 以上每一个表达式都可以省略:for(; 条件;) == while (条件)
  • 可以空循环,但建议加上大括号{}。
for(i=0;i<10;i++);for(i=0;i<10;i++)System.out.println(i);
  • 循环次数 与 控制变量的值:
for(i=0;i<n;i++)
// 循环次数正好为 n,循环结束后 i 的值是 n
// 初始化 i 为 0或1,循环条件为 i < n 或 i <= n,均影响循环次数及 i 最终的值。for(int i=0;i<n;i++)
// 可以直接在for语句中定义变量 i
// i 只在循环体中使用,出循环后,i未定义。
  • tips:
  • 如果有固定次数,用for循环;
  • 如果必须要执行一次,用do-while循环;
  • 其它情况用while循环。

循环控制 break vs continue

  • break : 跳出循环
  • continue : 跳过循环这一轮剩下的语句,进入下一轮

嵌套循环

  • break和continue 只能对所在的那层循环进行跳出或跳过
  • 可以在循环前放一个标号来标示循环,带标号的break和continue对那个循环起作用。
Outer:
for ( int one = 0; one <=amount; ++one )for ( int five = 0; five <= amount/5; ++five )for ( int ten = 0; ten <= amount/10; ++ten )for ( int twenty = 0; twenty <= amount/20; ++twenty )if ( one+five*5+ten*10+twenty*20 == amount ) {break Outer;}

逻辑运算

逻辑类型 boolean

关系运算的结果是一个逻辑值truefalse,可以保存在一个对应的逻辑类型变量中。

boolean flag = true;
boolean tooHigh, tooSmall, tooRough;
boolean done = false;

逻辑运算符 ! && ||

对逻辑量进行的运算,只有逻辑量可以参与运算

运算符描述示例结果
!逻辑非!a若a是true,则结果为false;如果a是false,则结果为true
&&逻辑与a&&ba和b都为true时,结果才为true;否则就是false
||逻辑或a||ba和b有一个为true时,结果即为true;两个都是false,结果为false
运算符优先级总结
优先级运算符结合性
1()从左到右
2! + - ++ - -从右到左
3* / %从左到右
4+ -从左到右
5< <= > >=从左到右
6== !=从左到右
7&&从左到右
8||从左到右
9= += -= *= /= %=从右到左

逻辑表达式

  • 4 < x < 6 是错误的表达式,因为 4 < x 结果是一个逻辑值,逻辑值不能和数值6做关系运算。正确的表达式是 x > 4 && x <6
  • age > 20 && age < 30 正确
  • index <0 || index > 99 正确
  • !age<20 报错, !(age < 20) 正确

循环的应用

求和

  • f ( n ) = 1 + 1 / 2 + 1 / 3 + 1 / 4 + … + 1 / n f(n)=1+1/2+1/3+1/4+…+1/n f(n)=1+1/2+1/3+1/4++1/n
Scanner in = new Scanner(System.in);
int n = in.nextInt();
double sum = 0.0;
for(int i= 1;i<=n;i++) {sum +=1.0/i;	
}
System.out.printf("%.2f", sum); // 只输出两位小数
  • f ( n ) = 1 − 1 / 2 + 1 / 3 − 1 / 4 + … + 1 / n f(n)=1-1/2+1/3-1/4+…+1/n f(n)=11/2+1/31/4++1/n

方案一:正负交错相乘

Scanner in = new Scanner(System.in);
int n = in.nextInt();
double sum = 0.0;
int sign = 1;
for(int i= 1; i<=n; i++, sign = -sign) {sum += sign * 1.0 / i;
}
System.out.printf("%.2f", sum);

方案二:奇数加,偶数减

Scanner in = new Scanner(System.in);
int n = in.nextInt();
double sum = 0.0;
int sign = 1;
for(int i= 1; i<=n; i++) {if( i%2 == 1) {sum += 1.0/i;	} else {sum -= 1.0/i;}
}
System.out.printf("%.2f", sum);

求最大公约数

  • 枚举法
Scanner in = new Scanner(System.in);
int a=in.nextInt();
int b=in.nextInt();
int gcd=1;
for(int i=2; i<=a && i<=b; i++) {if(a%i==0 && b%i==0) {// 如果a和b都能被i整除,则记下igcd = i;}				
}
System.out.println(a+"和"+b+"的最大公约数是:"+gcd);
  • 辗转相除法
Scanner in = new Scanner(System.in);
int a=in.nextInt();
int b=in.nextInt();
int t;
int origa = a;
int origb = b;
while(b != 0) {t = a%b; // 得到余数a = b;b = r;
}
if(b == 0) { // b等于0时,a就是最大公约数System.out.println(origa+"和"+origb+"的最大公约数是:"+a);	
}

整数分解

  • 逆序输出一个整数
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = 0;
do {y = y * 10 + x % 10;x /= 10;
} while (x > 0);
System.out.println(y);

编程题

题目1. 素数和(5分)

  • 题目内容
    我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。

    现在,给定两个整数n和m,0

    注意,是第n个素数到第m个素数之间的所有的素数,并不是n和m之间的所有的素数。

  • 输入格式
    两个整数,第一个表示n,第二个表示m。

  • 输出格式
    一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

  • 输入样例
    2 4

  • 输出样例
    15

解题代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int count = 1; // 计数器,初始化为1int result = 0; // 结果值for (int i = 2; count <= m; i++) { // 从2开始循环取数,直到count大于m。boolean isPrime = true;	// 默认是素数// 如果i可以被更小的数整除,则不是素数for (int j = 2; j < i; j++) {if (i != 2 && i % j == 0) { // 不检测整数2isPrime = false; break; // 立即跳出检测循环}}if (isPrime) {if(count >= n) {result += i;}count ++;}}System.out.println(result);}}

题目2. 念整数(5分)

  • 题目内容
    你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。

    如输入1234,则输出:

    yi er san si

    注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:

    fu er san si yi

  • 输入格式
    一个整数,范围是[-100000,100000]。

  • 输出格式
    表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。

  • 输入样例
    -30

  • 输出样例
    fu san ling

解题代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int number = in.nextInt();String py = "", // 拼音字符串comma = "", // 用来存放拼音之间的空格,默认没有空格result = ""; // 用来合成最后的输出内容if (number < 0) {System.out.print("fu ");number = -number;}do {// 循环取个位数的拼音switch (number % 10) {case 0:py = "ling";break;case 1:py = "yi";break;case 2:py = "er";break;case 3:py = "san";break;case 4:py = "si";break;case 5:py = "wu";break;case 6:py = "liu";break;case 7:py = "qi";break;case 8:py = "ba";break;case 9:py = "jiu";break;}result = py + comma + result;number /= 10; // 抹去已计算的个位数comma = " "; // 计算1次后,默认均有空格} while (number > 0);System.out.println(result);}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部