Java程式設計思想第四版第四章練習
練習1:寫一個程式,列印從1到100的值。
public class Exercise4_1 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
}
}
練習2:寫一個程式,產生25個int型別的隨機數,對於每一個隨機數,使用if-else語句來將其分類為大於、小於,或等於緊隨它而隨機產生的值。
public class Exercise4_2 {
public static void main (String[] args) {
Random random =new Random(47);
for (int i = 0; i < 25; i++) {
int a = random.nextInt();
int b = random.nextInt();
if(a > b) {
System.out.println(a+"大於"+b);
}else if(a < b) {
System.out.println(a+"小於" +b);
}else {
System.out.println(a+"等於"+b);
}
}
}
}
練習3:修改練習2,把程式碼用一個while無限迴圈包括起來。然後執行它直至用鍵盤中斷其執行(通常是通過按Ctrl+c).
public class Exercise4_3 {
public static void main(String[] args) {
while(true) {
Random random =new Random(47);
for (int i = 0; i < 25; i++) {
int a = random.nextInt();
int b = random.nextInt();
if(a > b) {
System.out.println(a+"大於"+b);
}else if(a < b) {
System.out.println(a+"小於"+b);
}else {
System.out.println(a+"等於"+b);
}
}
}
}
}
練習4:寫一個程式,使用兩個巢狀的for迴圈和取餘操作符(%)來探測和列印素數(只能被其自身和1整除,而不能被其它數字整除的整數)。
public class Exercise4_4 {
public static void main(String[] args) {
for (int i = 1; i < 100; i++) {
for (int j = 2; j < i; j++) {
if(i%j==0) {
break;
}else if(i%j!=0&&i==j+1) {
System.out.println(i);
}
}
}
}
}
public class Exercise4_4 {
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
boolean flag = true;
for (int j = 2; j < i; j++) {
if(i%j==0) {
flag = false;
break;
}
}
if(flag) {
System.out.println(" "+i);
}
}
}
}
練習5:重複第3章中的練習10,不要用Integer.toBinaryString()方法,而是用三元操作符和按位操作符來顯示二進位制的1和0。
public class Exercise4_5 {
private static void toBinaryString(int i) {
char[] buffer = new char[32];
int bufferPosition = 32;
do {
buffer[--bufferPosition] = ((i & 0X01) == 0) ? '0':'1';
i>>>=1;
}while(i!=0);
for (int j = 0; j < buffer.length; j++) {
System.out.print(buffer[j]);
}
System.out.println();
}
public static void main(String[] args) {
int i1 = 0Xaaaaaaaa;
int i2 = 0x55555555;
System.out.print("i1 = ");toBinaryString(i1);
System.out.print("i2 = ");toBinaryString(i2);
System.out.print("~i1 = ");toBinaryString(~i1);
System.out.print("~i2 = ");toBinaryString(~i2);
System.out.print("i1&i1 = ");toBinaryString(i1&i1);
System.out.print("i1|i1 = ");toBinaryString(i1|i1);
System.out.print("i1^i1 = ");toBinaryString(i1^i1);
System.out.print("i1&i2 = ");toBinaryString(i1&i2);
System.out.print("i1|i2 = ");toBinaryString(i1|i2);
System.out.print("i1^i2 = ");toBinaryString(i1^i2);
}
}
練習6:修改前兩個程式中的兩個test()方法,讓他們接受兩個額外的引數begin和end,這樣在測試testval時將判斷它是否在begin和end之間(包含begin和end)的範圍內。
public class Exercise4_6 {
static boolean Test(int testval,int begin,int end) {
boolean result = false;
if(testval>=begin&&testval<=end) {
result = true;
}
return result;
}
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:修改本章練習1,通過使用break關鍵詞,使得程式在列印99時退出。然後嘗試使用return來達到相同的目的。
public class Exercise4_7 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if(i==99) {
break;
}
System.out.println(i);
}
}
}
練習8:寫一個switch開關語句,為每個case列印一條訊息。然後把這個switch放進for迴圈來測試每個case。先讓每個case後面都有break,測試一下會怎樣,然後把break刪了,看看會怎樣。
public class Exercise4_8 {
public static void main(String[] args) {
for (int i = 0; i < 7; i++) {
switch (i) {
case 0:
System.out.println(i);
break;
case 1:
System.out.println(i);
break;
case 2:
System.out.println(i);
break;
case 3:
System.out.println(i);
break;
case 4:
System.out.println(i);
break;
default:
System.out.println("default");
break;
}
}
}
}
練習9:一個斐波那契數列由數字1、1、2、3、5、8、13、21、34等等組成的,其中每個數字(第三個數字起)都是前兩個數字的之和。建立一個方法,接受一個整數引數,並顯示從第一個元素開始總共由該引數指定的個數所構成的所有斐波那契數字
public class Exercise4_9 {
public static void main(String[] args) {
int x = 10;
switch (x) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("1,1");
break;
default:
int a=1,b=1;
for (int i = 0; i < x; i++) {
if(i<2) {
System.out.print("1,");
}else {
System.out.print(a+b+",");
int tem =b;
b=a+b;
a =tem;
}
}
break;
}
}
}
public class Exercise4_9 {
static int fib(int n) {
if(n<=2) {
return 1;
}
return fib(n-1)+fib(n-2);
}
public static void main(String[] args) {
for (int i = 1; i <=10; i++) {
System.out.print(fib(i)+" ");
}
}
}
練習10: 吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得到,而這對數字包含乘積一半位數的數字,其中從最初的數字中選取的數字可以任意排序。以兩個0結尾的數字是不允許的,例如,下列數字就是“吸血鬼”數字:
1260 = 21*60
1827 = 21*87
2187 = 27*81
寫一個程式,找出4位數的所有吸血鬼數字。
public class Exercise4_10 {
public static void main(String[] args) {
int []startDigit = new int[4];
int []productDigit = new int[4];
for (int i = 10; i <=99; i++) {
for (int j = 10; j <=99; j++) {
if(((i*j)%9)!=((i+j)%9)) {
//吸血鬼數字必然滿足這個條件
continue;
}
int product = i*j;
startDigit[0]=i/10;
startDigit[1]=i%10;
startDigit[2]=j/10;
startDigit[3]=j%10;
productDigit[0] = product/1000;
productDigit[1] = product/100%10;
productDigit[2] = product%100/10;
productDigit[3] = product%10;
int count = 0;
for (int k = 0; k < 4; k++) {
for (int k2 = 0; k2 < 4; k2++) {
if(productDigit[k]==startDigit[k2]) {
count++;
startDigit[k2] =-1;
productDigit[k] =-2;
if(count==4) {
System.out.println(product);
}
}
}
}
}
}
}
}
public class Exercise4_10 {
public static void main(String[] args) {
VampireNum();
}
static void f(int x,int y,int m,int n,int i) {
if((x*10+y)*(m*10+n)==i) {
System.out.println(x+","+y+","+m+","+n);
System.out.println(i);
}
}
static void VampireNum() {
for (int i = 1000; i < 10000; i++) {
int a =i/1000;
int b =i/100%10;
int c =i%100/10;
int d =i%10;
f(a,b,c,d,i);
f(a,b,d,c,i);
f(a,c,b,d,i);
f(a,c,d,b,i);
f(a,d,b,c,i);
f(a,d,c,b,i);
f(b,a,c,d,i);
f(b,a,d,c,i);
f(b,c,d,a,i);
f(b,d,c,a,i);
f(c,a,d,b,i);
f(c,b,d,a,i);
}
}
}