以下为个人学习笔记和习题整理
课程:零基础学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)
正确
循环的应用
求和
- 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)=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 = 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<=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);
}
}