首页 > 学院 > 开发设计 > 正文

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

2019-11-14 21:52:15
字体:
来源:转载
供稿:网友
曾经做过的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&hellip;依此类推。  

算法原理:

使用一个二维数组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种比较高效常用的排序算法

    》如何获取系统信息

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表