以下为个人学习笔记和习题整理
课程:零基础学 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
关系运算的结果是一个逻辑值 true
或 false
,可以保存在一个对应的逻辑类型变量中。
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)
正确
# 循环的应用
# 求和
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); // 只输出两位小数 |
方案一:正负交错相乘
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); | |
} | |
} |