曾经做过的40道程序设计课后习题总结

王朝学院·作者佚名  2016-05-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

曾经做过的40道程序设计课后习题总结曾经做过的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 ,里面有全面详细的总结。

原创文章欢迎转载,转载时请注明出处。

作者推荐文章:

》Java自学之道

》给程序入门者的一点建议

》总结5种比较高效常用的排序算法

》如何获取系统信息

》如何生成二维码过程详解

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航