以下为个人学习笔记和习题整理
课程:零基础学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次就够了?
二分法:
对于某个数使用二分法的最少次数的公式为 2 n > k 2^n>k 2n>k,其中n为最少次数,k为一共有多少数。
因为 2 7 2^7 27是128,大于100,可以判断100以内只需要7次。
小测验
-
以下哪种运算能从变量x中取得它的个位数?
A. x/10
B. x%10
C. x*10
D. x=10B
-
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);
}
}