曾經(jīng)做過的40道程序設(shè)計(jì)課后習(xí)題總結(jié)(一)
課后習(xí)題目錄
1 斐波那契數(shù)列2 判斷素?cái)?shù)3 水仙花數(shù)4 分解質(zhì)因數(shù)5 楊輝三角6 學(xué)習(xí)成績查詢7 求最大公約數(shù)與最小公倍數(shù)8 完全平方數(shù)9 統(tǒng)計(jì)字母、空格、數(shù)字和其它字符個(gè)數(shù)10 求主對(duì)角線之和11 完數(shù)求解12 求s=a+aa+aaa+aaaa+aa...a的值13 高度計(jì)算14 乘法口訣15 無重復(fù)三位數(shù)16 菱形打印17 利潤計(jì)算18 第幾天判斷19 從小到大輸出數(shù)列20 猴子吃桃問題21 乒乓球比賽22 求分?jǐn)?shù)之和23 求階乘的和24 遞歸求法25 求不多于5的正整數(shù)26 回文判斷27 星期判斷28 插數(shù)入數(shù)組29 取整數(shù)的任意位30 按順序輸出數(shù)列31 位置替換32 字符串排序33 貸款器34 通訊錄排序35 閏年判斷36 二元方程求解37 密碼解譯38 DVD查詢39 電子日歷40 萬年歷
1 斐波那契數(shù)列
1.1 題目:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長到第三個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死,問每個(gè)月的兔子總數(shù)為多少?
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.1.3 運(yùn)行結(jié)果
第3個(gè)月的兔子對(duì)數(shù): 2
第4個(gè)月的兔子對(duì)數(shù): 3
第5個(gè)月的兔子對(duì)數(shù): 5
第6個(gè)月的兔子對(duì)數(shù): 8
第7個(gè)月的兔子對(duì)數(shù): 13
第8個(gè)月的兔子對(duì)數(shù): 21
第9個(gè)月的兔子對(duì)數(shù): 34
第10個(gè)月的兔子對(duì)數(shù): 55
第11個(gè)月的兔子對(duì)數(shù): 89
第12個(gè)月的兔子對(duì)數(shù): 144
第13個(gè)月的兔子對(duì)數(shù): 233
第14個(gè)月的兔子對(duì)數(shù): 377
1.4 源程序揭秘
斐波那契數(shù)列公式:
2 判斷素?cái)?shù)
2.1 題目:判斷101-200之間有多少個(gè)素?cái)?shù),并輸出所有素?cái)?shù)。 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;// 默認(rèn)此數(shù)就素?cái)?shù) for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { b = false; // 此數(shù)不是素?cái)?shù) break; } } if (b) { count++; System.out.print(i + " "); } } System.out.println("/n素?cái)?shù)的個(gè)數(shù):" + count); }}2.3 運(yùn)行結(jié)果:
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
素?cái)?shù)的個(gè)數(shù):21
2.4 源程序揭秘
判斷素?cái)?shù)的方法:用一個(gè)數(shù)分別去除2到sqrt(這個(gè)數(shù)),如果能被整除,則表明此數(shù)不是素?cái)?shù),反之是素?cái)?shù)。
3 水仙花數(shù)
3.1題目:打印出所有的"水仙花數(shù)(narcissus number)",所謂"水仙花數(shù)"是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如:153是一個(gè)"水仙花數(shù)",因?yàn)?53=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 運(yùn)行結(jié)果:
153
370
371
407
3.4 源程序揭秘
利用for循環(huán)控制100-999個(gè)數(shù),每個(gè)數(shù)分解出個(gè)位,十位,百位。
4 分解質(zhì)因數(shù)
4.1題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入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 運(yùn)行結(jié)果:
200
200=2*2*2*5*5
4.4 源程序揭秘
對(duì)n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按下述步驟完成: (1)如果這個(gè)質(zhì)數(shù)恰等于n,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可。 (2)如果n>k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)你n,重復(fù)執(zhí)行第一步。 (3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
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 運(yùn)行結(jié)果:
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 源程序揭秘
楊輝三角形性質(zhì):
每行數(shù)字左右對(duì)稱,由1開始逐漸變大,然后變小,回到1。
第n行的數(shù)字個(gè)數(shù)為n個(gè)。
第n行數(shù)字和為2^(n-1)。
每個(gè)數(shù)字等于上一行的左右兩個(gè)數(shù)字之和。可用此性質(zhì)寫出整個(gè)楊輝三角形。
第n行的第1個(gè)數(shù)為1,第二個(gè)數(shù)為1×(n-1),第三個(gè)數(shù)為1×(n-1)×(n-2)/2,第四個(gè)數(shù)為1×(n-1)×(n-2)/2×(n-3)/3…依此類推。
算法原理:
使用一個(gè)二維數(shù)組yh[][]存儲(chǔ)楊輝三角形的數(shù)據(jù),行和列的大小為所需要輸出的行數(shù)Row(本程序中Row為10)。
使用for循環(huán)使楊輝三角中除了最外層(不包括楊輝三角底邊)的數(shù)為1 ;
使用語句yh[i][j] = yh[i - 1][j - 1] + yh[i - 1][j]使第i行第j列的數(shù)據(jù)等于第(i-1)行第(j-1)列的數(shù)據(jù)與第(i-1)行第(j)列的數(shù)據(jù)之和,即每個(gè)數(shù)字等于上一行的左右兩個(gè)數(shù)字之和。
6 學(xué)習(xí)成績查詢
6.1 題目:利用條件運(yùn)算符的嵌套來完成此題:學(xué)習(xí)成績>=90分的同學(xué)用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 運(yùn)行結(jié)果:
90
B
6.4 源程序揭秘
利用(a>b)?a:b條件運(yùn)算符來處理。
7 求最大公約數(shù)與最小公倍數(shù)
7.1 題目:輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。 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("最大公約數(shù): " + m); System.out.println("最小公倍數(shù): " + 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 運(yùn)行結(jié)果:
56
78
最大公約數(shù): 2
最小公倍數(shù): 2184
7.4 源程序揭秘
在循環(huán)中,只要除數(shù)不等于0,用較大數(shù)除以較小的數(shù),將小的一個(gè)數(shù)作為下一輪循環(huán)的大數(shù),取得的余數(shù)作為下一輪循環(huán)的較小的數(shù),如此循環(huán)直到較小的數(shù)的值為0,返回較大的數(shù),此數(shù)即為最小公約數(shù),最小公倍數(shù)為兩數(shù)之積除以最小公倍數(shù)。
8 完全平方數(shù)
8.1 題目:一個(gè)整數(shù),它加上100后是一個(gè)完全平方數(shù),再加上168又是一個(gè)完全平方數(shù),請問該數(shù)是多少? 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是一個(gè)完全平方數(shù),再加168又是一個(gè)完全平方數(shù)"); } } } }}8.3 運(yùn)行結(jié)果:
21加100是一個(gè)完全平方數(shù),再加168又是一個(gè)完全平方數(shù)
261加100是一個(gè)完全平方數(shù),再加168又是一個(gè)完全平方數(shù)
1581加100是一個(gè)完全平方數(shù),再加168又是一個(gè)完全平方數(shù)
8.4 源程序揭秘
在10萬以內(nèi)判斷,先將該數(shù)加上100后再開方,再將該數(shù)加上268后再開方,如果開方后的結(jié)果滿足如下條件,即是結(jié)果。
9 統(tǒng)計(jì)字母、空格、數(shù)字和其它字符個(gè)數(shù)
9.1 題目:輸入一行字符,分別統(tǒng)計(jì)出其中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)。 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("數(shù)字個(gè)數(shù): " + digital); System.out.println("英文字母個(gè)數(shù): " + character); System.out.println("空格個(gè)數(shù): " + blank); System.out.println("其他字符個(gè)數(shù):" + other); } }9.3 運(yùn)行結(jié)果:
sadf239 asl!~@#*(#)
數(shù)字個(gè)數(shù): 3
英文字母個(gè)數(shù): 7
空格個(gè)數(shù): 2
其他字符個(gè)數(shù):8
9.4 源程序揭秘
利用while語句,條件為輸入的字符不為 '/n '。
10 求主對(duì)角線之和
10.1 題目:求一個(gè)3*3矩陣對(duì)角線元素之和。
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("對(duì)角線和是 " + sum); }}10.3 運(yùn)行結(jié)果:
2 3 4 5
34 4 56 67
12 34 5 6
輸入的3 * 3 矩陣是:
2 3 4
5 34 4
56 67 12
對(duì)角線和是 48
10.4 源程序揭秘
利用雙重for循環(huán)控制輸入二維數(shù)組,再將a[i][i]累加后輸出。
由于博客字?jǐn)?shù)限制,40道程序設(shè)計(jì)課后習(xí)題總結(jié)將分4篇帖子進(jìn)行總結(jié),后面3篇帖子后面會(huì)一一貼出,或者可以在自己的博客下載已經(jīng)總結(jié)完的全文 http://my.oschina.net/mkh/blog/340689 ,里面有全面詳細(xì)的總結(jié)。
原創(chuàng)文章歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請注明出處。
作者推薦文章:
》Java自學(xué)之道
》給程序入門者的一點(diǎn)建議
》總結(jié)5種比較高效常用的排序算法
》如何獲取系統(tǒng)信息
》如何生成二維碼過程詳解
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注