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

# 课堂笔记

# 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/nf(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)=11/2+1/31/4++1/nf(n)=1-1/2+1/3-1/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 = t;
}
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<=200 ,你的程序要计算第 n 个素数到第 m 个素数之间所有的素数的和,包括第 n 个素数和第 m 个素数。

    注意,是第 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);
		
	}
}
阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Ruri Shimotsuki 微信支付

微信支付

Ruri Shimotsuki 支付宝

支付宝

Ruri Shimotsuki 贝宝

贝宝