『零基础学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&&b a和b都为true时,结果才为true;否则就是false
|| 逻辑或 a||b a和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整除,则记下i
		gcd = 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; // 计数器,初始化为1
		int 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) { // 不检测整数2
					isPrime = 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);
		
	}

}

你可能感兴趣的:(自考笔记,#,04747Java语言程序设计)