曾经做过的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 运行结果:

21100是一个完全平方数,再加168又是一个完全平方数

261100是一个完全平方数,再加168又是一个完全平方数

1581100是一个完全平方数,再加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种比较高效常用的排序算法

    》如何获取系统信息

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

 

posted @ 2014-11-12 10:58  闵开慧  阅读(1383)  评论(8编辑  收藏  举报