Thinking in Java 第四版完整版 第四章练习题,记录一下(jdk1.8.0)
1.
/**
* 练习1:写一个程序,打印从1到100的值。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise401 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
System.out.print(i+"\t");
if(i % 15 == 0) {
System.out.println();
}
}
}
}
2.
import java.util.Random;
/**
* 练习2:写一个程序,产生25个int类型的随机数。对于每一个随机值,使用
* if-else语句来将其分类为大于、小于或等于紧随它而随机生成的值。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise402 {
public static void compare() {
Random randonm = new Random();
int a = randonm.nextInt();
int b = randonm.nextInt();
System.out.println("a = " + a + ", b = " + b);
if(a > b) {
System.out.println("a > b");
} else if (a == b) {
System.out.println("a == b");
} else if (a < b) {
System.out.println("a < b");
}
}
public static void main(String[] args) {
for (int i = 0; i < 25; i++) {
compare();
}
}
}
3.
import java.util.Random;
/**
* 练习3:修改练习2,把代码用一个while无限循环包括起来。然后运行它直至用键盘中断
* 其运行(通常是通过按Ctrl-C)。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise403 {
public static void compare() {
Random randonm = new Random();
int a = randonm.nextInt();
int b = randonm.nextInt();
System.out.println("a = " + a + ", b = " + b);
if(a > b) {
System.out.println("a > b");
} else if (a == b) {
System.out.println("a == b");
} else if (a < b) {
System.out.println("a < b");
}
}
public static void main(String[] args) {
while(true) {
compare();
}
}
}
4.
/**
* 练习4:写一个程序,使用两个嵌套的for循环和取余操作符(%)来探测和打印素数
* (只能被其自身和1整除,而不能被其它数字整除的整数)。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise404 {
public static void main(String[] args) {
for (int i = 1; i < 100; i++) {
boolean flag = true;
for (int j = 2; j < i; j++) {
if(i % j == 0) {
flag = false;
}
}
if(flag) {
System.out.print(i + " ");
}
}
}
}
5.
/**
* 练习5:重复第3章中的练习10,不要用Integer.toBinaryString()方法,而是用三元操作符
* 和按位操作符来显示二进制的1和0。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise405 {
public static String toBinaryString(int i) {
char[] buffer = new char[32];
int bufferPosition = 32;
String res = "";
do {
buffer[--bufferPosition] = ((i & 0x01) != 0) ? '1' : '0';
i = i >>> 1;
} while(i != 0);
for (int j = bufferPosition; j < buffer.length; j++) {
res = res + buffer[j];
}
return res;
}
public static void main(String[] args) {
int i1 = 0xaaaaaaaa;
int i2 = 0x55555555;
System.out.println("i1 = " + toBinaryString(i1));
System.out.println("i2 = " + toBinaryString(i2));
System.out.println("~i1 = " + toBinaryString(~i1));
System.out.println("~i2 = " + toBinaryString(~i2));
System.out.println("i1 & i2 = " + toBinaryString(i1 & i2));
System.out.println("i1 | i2 = " + toBinaryString(i1 | i2));
System.out.println("i1 ^ i2 = " + toBinaryString(i1 ^ i2));
System.out.println("i1 & i1 = " + toBinaryString(i1 & i1));
System.out.println("i1 | i1 = " + toBinaryString(i1 | i1));
System.out.println("i1 ^ i1 = " + toBinaryString(i1 ^ i1));
System.out.println("i2 & i2 = " + toBinaryString(i2 & i2));
System.out.println("i2 | i2 = " + toBinaryString(i2 | i2));
System.out.println("i2 ^ i2 = " + toBinaryString(i2 ^ i2));
}
}
6.
/**
* 练习6:修改前两个程序中的两个test()方法,让它们接收两个额外的参数begin和end,
* 这样在测试testval时将判断它是否在begin和end之间(包括begin和end)的范围内。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise406 {
static boolean test(int testval, int begin, int end) {
if(testval >= begin && testval <= end) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
System.out.println(test(10, 5, 15));
System.out.println(test(5, 10, 15));
System.out.println(test(5, 5, 5));
}
}
7.
/**
* 练习7:修改本章练习1,通过使用break关键词,使得程序在打印到99时退出。
* 然后尝试使用return来达到相同的目的。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise407 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if(i == 99) {
return; // break;
}
System.out.print(i+" ");
if(i % 30 == 0) {
System.out.println();
}
}
}
}
8.
/**
* 练习8:写一个switch开关语句,为每个case打印一个消息。然后把这个switch放进for
* 循环来测试每个case。先让每个case后面都有break,测试一下会怎样;然后把break删了,
* 看看会怎样。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise408 {
public static void main(String[] args) {
for(int i = 0; i < 4; i++) {
switch (i) {
case 0:
System.out.println("value is 0");
//break;
case 1:
System.out.println("value is 1");
//break;
case 2:
System.out.println("value is 2");
//break;
case 3:
System.out.println("value is 3");
//break;
default:
System.out.println("value is default");
}
System.out.println("-------------------------------");
}
}
}
9.
/**
* 练习9:一个斐波那契数列是由数字1、1、2、3、5、8、13、21、34等等组成的,其中每一个数字(从第三个数字起)
* 都是前两个数字的和。创建一个方法,接收一个整数参数,并显示从第一个元素开始总共由该参数指定的个数所构成
* 的所有斐波那契数字。例如,如果运行java Fibonacci 5(其中Fibonacci是类名),那么输出就应该
* 是1、1、2、3、5。
* @author admin11
* @date 2018年3月1日
*/
public class Fibonacci {
public static int fibonacci(int i) {
if(i == 1) {
return 1;
} else if(i == 2) {
return 1;
} else {
return fibonacci(i - 1) + fibonacci(i - 2);
}
}
public static void main(String[] args) {
int cnt = Integer.parseInt(args[0]);
for(int i = 1; i <= cnt; i++) {
System.out.print(fibonacci(i) + " ");
}
}
}
10.
/**
* 练习10:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各含乘积的一半位数
* 的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,
* 下列数字都是“吸血鬼”数字:
* 1260 = 21 * 60
* 1827 = 21 * 87
* 2187 = 27 * 81
* 写一个程序,找出4位数的所有吸血鬼数字。
* @author admin11
* @date 2018年3月1日
*/
public class Exercise410 {
public static void main(String[] args) {
int[] startDigit = new int[4];
int[] productDigit = new int[4];
for (int num1 = 10; num1 <= 99; num1++) {
for(int num2 = num1; num2 <= 99; num2++) {
if((num1 * num2) %9 != (num1 + num2) % 9) {
continue;
}
int product = num1 * num2;
startDigit[0] = num1 /10;
startDigit[1] = num1 % 10;
startDigit[2] = num2 / 10;
startDigit[3] = num2 % 10;
productDigit[0] = product / 1000;
productDigit[1] = (product % 1000) / 100;
productDigit[2] = product % 1000 % 100 / 10;
productDigit[3] = product % 1000 % 100 % 10;
int count = 0;
for(int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
if(productDigit[x] == startDigit[y]) {
count++;
productDigit[x] = -1;
startDigit[y] = -2;
if(count == 4) {
System.out.println(num1 + "*" + num2 + " : " + product);
}
}
}
}
}
}
}
}