曾經做過的40道程序設計課后習題總結(一)
課后習題目錄
1 斐波那契數列
2 判斷素數
3 水仙花數
4 分解質因數
5 楊輝三角
6 學習成績查詢
7 求最大公約數與最小公倍數
8 完全平方數
9 統計字母、空格、數字和其它字符個數
10 求主對角線之和
11 完數求解
12 求s=a+aa+aaa+aaaa+aa...a的值
13 高度計算
14 乘法口訣
15 無重復三位數
16 菱形打印
17 利潤計算
18 第幾天判斷
19 從小到大輸出數列
20 猴子吃桃問題
21 乒乓球比賽
22 求分數之和
23 求階乘的和
24 遞歸求法
25 求不多於5的正整數
26 回文判斷
27 星期判斷
28 插數入數組
29 取整數的任意位
30 按順序輸出數列
31 位置替換
32 字符串排序
33 貸款器
34 通訊錄排序
35 閏年判斷
36 二元方程求解
37 密碼解譯
38 DVD查詢
39 電子日歷
40 萬年歷
1 斐波那契數列
1.1 題目:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
1.2 源程序
public class Fibonacci { public static final int MONTH = 15; public static void main(String[] args) { long f1 = 1L, f2 = 1L; long f; for (int i = 3; i < MONTH; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.print("第" + i + "個月的兔子對數: "); System.out.println(" " + f2); } } }
1.3 運行結果
第3個月的兔子對數: 2
第4個月的兔子對數: 3
第5個月的兔子對數: 5
第6個月的兔子對數: 8
第7個月的兔子對數: 13
第8個月的兔子對數: 21
第9個月的兔子對數: 34
第10個月的兔子對數: 55
第11個月的兔子對數: 89
第12個月的兔子對數: 144
第13個月的兔子對數: 233
第14個月的兔子對數: 377
1.4 源程序揭秘
2 判斷素數
2.1 題目:判斷101-200之間有多少個素數,並輸出所有素數。
2.2 源程序
public class Prime { public static int count = 0; public static void main(String[] args) { for (int i = 101; i < 200; i++) { boolean b = true;// 默認此數就素數 for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { b = false; // 此數不是素數 break; } } if (b) { count++; System.out.print(i + " "); } } System.out.println("\n素數的個數:" + count); } }
2.3 運行結果:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
素數的個數:21
2.4 源程序揭秘
判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。
3 水仙花數
3.1題目:打印出所有的"水仙花數(narcissus number)",所謂"水仙花數"是指一個三位數,其各位數字立方和等於該數本身。例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。
3.2 源程序
public class shuixian { static int b, bb, bbb; public static void main(String[] args) { for (int num = 101; num < 1000; num++) { shuixian tnn = new shuixian(); tnn.f(num); } } public void f(int m) { bbb = m / 100; bb = (m % 100) / 10; b = (m % 100) % 10; if ((bbb * bbb * bbb + bb * bb * bb + b * b * b) == m) { System.out.println(m); } } }
3.3 運行結果:
153
370
371
407
3.4 源程序揭秘
利用for循環控制100-999個數,每個數分解出個位,十位,百位。
4 分解質因數
4.1題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
4.2 源程序
import java.util.Scanner; public class ZhiYinShu { static int n, k = 2; public static void main(String[] args) { Scanner s = new Scanner(System.in); n = s.nextInt(); System.out.print(n + "="); ZhiYinShu fpf = new ZhiYinShu(); fpf.f(n); } public void f(int n) { while (k <= n) { if (k == n) { System.out.println(n); break; } else if (n > k && n % k == 0) { System.out.print(k + "*"); n = n / k; f(n); break; } else if (n > k && n % k != 0) { k++; f(n); break; } } } }
4.3 運行結果:
200
200=2*2*2*5*5
4.4 源程序揭秘
對n進行分解質因數,應先找到一個最小的質數k,然后按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數你n,重復執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重復執行第一步。
5 楊輝三角
5.1 題目:打印出楊輝三角形(要求打印出10行如下圖)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
5.2 源程序
public class YangHuiSanJiao { public static void main(String[] args) { int[][] a = new int[10][10]; for (int i = 0; i < 10; i++) { a[i][i] = 1; a[i][0] = 1; } for (int i = 2; i < 10; i++) { for (int j = 1; j < i; j++) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } } for (int i = 0; i < 10; i++) { for (int k = 0; k < 2 * (10 - i) - 1; k++) { System.out.print(" "); } for (int j = 0; j <= i; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } } }
5.3 運行結果:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
5.4 源程序揭秘
楊輝三角形性質:
每行數字左右對稱,由1開始逐漸變大,然后變小,回到1。
第n行的數字個數為n個。
第n行數字和為2^(n-1)。
每個數字等於上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角形。
第n行的第1個數為1,第二個數為1×(n-1),第三個數為1×(n-1)×(n-2)/2,第四個數為1×(n-1)×(n-2)/2×(n-3)/3…依此類推。
算法原理:
使用一個二維數組yh[][]存儲楊輝三角形的數據,行和列的大小為所需要輸出的行數Row(本程序中Row為10)。
使用for循環使楊輝三角中除了最外層(不包括楊輝三角底邊)的數為1 ;
使用語句yh[i][j] = yh[i - 1][j - 1] + yh[i - 1][j]使第i行第j列的數據等於第(i-1)行第(j-1)列的數據與第(i-1)行第(j)列的數據之和,即每個數字等於上一行的左右兩個數字之和。
6 學習成績查詢
6.1 題目:利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。
6.2 源程序
import java.util.Scanner; public class ChaXun { static int grade; public static void main(String[] args) { Scanner str = new Scanner(System.in); int s = str.nextInt(); ChaXun fc = new ChaXun(); grade = fc.compare(s); if (grade == 1) { System.out.print('A'); } else if (grade == 2) { System.out.print('B'); } else { System.out.println('C'); } } public int compare(int s) { return s > 90 ? 1 : s > 60 ? 2 : 3; } }
6.3 運行結果:
90
B
6.4 源程序揭秘
利用(a>b)?a:b條件運算符來處理。
7 求最大公約數與最小公倍數
7.1 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
7.2 源程序
import java.util.Scanner; public class YueBei { public static void main(String[] args) { int a, b; Scanner s1 = new Scanner(System.in); Scanner s2 = new Scanner(System.in); a = s1.nextInt(); b = s2.nextInt(); YueBei scd = new YueBei(); int m = scd.division(a, b); int n = a * b / m; System.out.println("最大公約數: " + m); System.out.println("最小公倍數: " + n); } public int division(int x, int y) { int t; if (x < y) { t = x; x = y; y = t; } while (y != 0) { if (x == y) return 1; else { int k = x % y; x = y; y = k; } } return x; } }
7.3 運行結果:
56
78
最大公約數: 2
最小公倍數: 2184
7.4 源程序揭秘
在循環中,只要除數不等於0,用較大數除以較小的數,將小的一個數作為下一輪循環的大數,取得的余數作為下一輪循環的較小的數,如此循環直到較小的數的值為0,返回較大的數,此數即為最小公約數,最小公倍數為兩數之積除以最小公倍數。
8 完全平方數
8.1 題目:一個整數,它加上100后是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
8.2 源程序
public class WanQuan { public static void main(String[] args) { for (long l = 1L; l < 100000; l++) { if (Math.sqrt((long) (l + 100)) % 1 == 0) { if (Math.sqrt((long) (l + 268)) % 1 == 0) { System.out.println(l + "加100是一個完全平方數,再加168又是一個完全平方數"); } } } } }
8.3 運行結果:
21加100是一個完全平方數,再加168又是一個完全平方數
261加100是一個完全平方數,再加168又是一個完全平方數
1581加100是一個完全平方數,再加168又是一個完全平方數
8.4 源程序揭秘
在10萬以內判斷,先將該數加上100后再開方,再將該數加上268后再開方,如果開方后的結果滿足如下條件,即是結果。
9 統計字母、空格、數字和其它字符個數
9.1 題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。
9.2 源程序
import java.util.*; public class Number { static int digital = 0; static int character = 0; static int other = 0; static int blank = 0; public static void main(String[] args) { char[] ch = null; Scanner sc = new Scanner(System.in); String s = sc.nextLine(); ch = s.toCharArray(); for (int i = 0; i < ch.length; i++) { if (ch[i] >= '0' && ch[i] <= '9') { digital++; } else if ((ch[i] >= 'a' && ch[i] <= 'z') || ch[i] > 'A' && ch[i] <= 'Z') { character++; } else if (ch[i] == ' ') { blank++; } else { other++; } } System.out.println("數字個數: " + digital); System.out.println("英文字母個數: " + character); System.out.println("空格個數: " + blank); System.out.println("其他字符個數:" + other); } }
9.3 運行結果:
sadf239 asl!~@#*(#)
數字個數: 3
英文字母個數: 7
空格個數: 2
其他字符個數:8
9.4 源程序揭秘
利用while語句,條件為輸入的字符不為 '\n '。
10 求主對角線之和
10.1 題目:求一個3*3矩陣對角線元素之和。
10.2 源程序
import java.util.Scanner; public class DuiJiaoXian { public static void main(String[] args) { Scanner s = new Scanner(System.in); int[][] a = new int[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { a[i][j] = s.nextInt(); } } System.out.println("輸入的3 * 3 矩陣是:"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } int sum = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { sum += a[i][j]; } } } System.out.println("對角線和是 " + sum); } }
10.3 運行結果:
2 3 4 5
34 4 56 67
12 34 5 6
輸入的3 * 3 矩陣是:
2 3 4
5 34 4
56 67 12
對角線和是 48
10.4 源程序揭秘
利用雙重for循環控制輸入二維數組,再將a[i][i]累加后輸出。
由於博客字數限制,40道程序設計課后習題總結將分4篇帖子進行總結,后面3篇帖子后面會一一貼出,或者可以在自己的博客下載已經總結完的全文 http://my.oschina.net/mkh/blog/340689 ,里面有全面詳細的總結。
原創文章歡迎轉載,轉載時請注明出處。
作者推薦文章: