曾经做过的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种比较高效常用的排序算法
》如何获取系统信息
》如何生成二维码过程详解
新闻热点
疑难解答