以下为个人学习笔记和习题整理
课程:零基础学 Java 语言 - 浙江大学 - 翁恺 @ 中国大学 MOOC
https://www.icourse163.org/course/ZJU-1001541001
# 课堂笔记
# while 循环
while (<循环条件>) | |
{ | |
<循环体语句>; | |
} |
- 先判断条件是否满足,然后再执行循环体,直到条件不满足为止。
- 可能一次也不执行。
# do-while 循环
do { | |
<循环体语句>; | |
} while(<循环条件>); // 句末分号不可丢 |
- 进入时不检查,执行完一轮后,再检查条件是否满足,如果满足则继续执行循环体。
- 至少执行一次。
# 例子
# 算平均数
Scanner in = new Scanner(System.in); | |
int number; | |
int count = 0; | |
int sum = 0; | |
number = in.nextInt(); | |
while(number != -1) { | |
sum += number; | |
count ++; | |
number = in.nextInt(); | |
} | |
if (count > 0) { | |
System.out.println((double)(sum)/count); | |
} |
Scanner in = new Scanner(System.in); | |
int number; | |
int count = 0; | |
int sum = 0; | |
do { | |
number = in.nextInt(); | |
if(number != -1) { | |
sum += number; | |
count ++; | |
} | |
} while (number != -1); | |
if (count > 0) { | |
System.out.println((double)(sum)/count); | |
} |
# 猜数游戏
Scanner in = new Scanner(System.in); | |
int number = (int)(Math.random()*100+1); | |
// 每次召唤 Math.random () 就得到一个 [0,1) 范围内的随机数 | |
// [0,1)-->[0,100)-->[1,100] | |
int count = 0; | |
int a; | |
do { | |
a = in.nextInt(); | |
count ++; | |
if(a > number) { | |
System.out.println("猜大了"); | |
} else if(a < number) { | |
System.out.println("猜小了"); | |
} | |
} while (a != number); | |
System.out.println("恭喜你猜对啦!你一共猜了"+count+"次。"); |
- 为什么方法正确的话,100 以内的数最多猜 7 次就够了?
二分法:
对于某个数使用二分法的最少次数的公式为 ,其中 n 为最少次数,k 为一共有多少数。
因为 是 128,大于 100,可以判断 100 以内只需要 7 次。
# 小测验
以下哪种运算能从变量 x 中取得它的个位数?
while 循环的条件满足的时候循环继续,而 do-while 的条件满足的时候循环就结束了。
以下代码片段执行结束后,变量 i 的值是多少?
int i = 1;
do {
i = i+5;
} while (i<17);
21
# 编程题
# 作业 1. 奇偶个数(5 分)
- 题目内容
你的程序要读入一系列正整数数据,输入 - 1 表示输入结束,-1 本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。 - 输入格式
一系列正整数,整数的范围是(0,100000)。如果输入 - 1 则表示输入结束。 - 输出格式
两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。 - 输入样例
9 3 4 2 5 7 -1 - 输出样例
4 2
# 解题代码
import java.util.Scanner; | |
public class Main { | |
public static void main(String[] args) { | |
Scanner in = new Scanner(System.in); | |
int number = in.nextInt(), | |
odd = 0, | |
even = 0; | |
while (number != -1) { | |
if (number % 2 == 0) | |
{ | |
even ++; | |
} | |
else | |
{ | |
odd ++; | |
} | |
number = in.nextInt(); | |
} | |
System.out.println(odd + " " + even); | |
} | |
} |
# 作业 2. 数字特征值(5 分)
题目内容
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是 1 号,十位是 2 号,以此类推。这个整数在第 n 位上的数字记作 x,如果 x 和 n 的奇偶性相同,则记下一个 1,否则记下一个 0。按照整数的顺序把对应位的表示奇偶性的 0 和 1 都记录下来,就形成了一个二进制数字。比如,对于 342315,这个二进制数字就是 001101。这里的计算可以用下面的表格来表示:
数字 | 3 | 4 | 2 | 3 | 1 | 5 |
数位 | 6 | 5 | 4 | 3 | 2 | 1 |
数字 | 奇 | 偶 | 奇 | 偶 | 偶 | 奇 |
数位 | 奇 | 偶 | 偶 | 奇 | 偶 | 奇 |
奇偶一致 | 0 | 0 | 1 | 1 | 0 | 1 |
二进制位值 | 32 | 16 | 8 | 4 | 2 | 1 |
按照二进制位值将 1 的位的位值加起来就得到了结果 13。
你的程序要读入一个非负整数,整数的范围是 [0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加 1,而二进制值每次乘 2。
输入格式
一个非负整数,整数的范围是 [0,1000000]。输出格式
一个整数,表示计算结果。输入样例
342315输出样例
13
# 解题代码
import java.util.Scanner; | |
public class Main { | |
public static void main(String[] args) { | |
Scanner in = new Scanner(System.in); | |
int number = in.nextInt(), | |
digit, // 个位数存储 | |
binary = 1, // 二进制位值,第一个循环时为 1 | |
count = 1, // 循环次数 | |
result = 0; // 结果值 | |
do { | |
digit = number % 10; // 计算当前循环的个位数 | |
if ( digit % 2 == count % 2) | |
{ // 个位数与循环次数的奇偶一致 | |
result += binary; // 则追加相应二进制位值 | |
} | |
// 以下计算出下一个循环需要的参数 | |
number /= 10; // 抹去已计算的个位数 | |
binary *= 2; // 二进制位值每次乘 2 | |
count ++; // 循环次数加 1 | |
} while (number > 0); // 循环条件 | |
System.out.println(result); | |
} | |
} |