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

原创
2015/08/11 11:19
阅读数 2.7K

曾经做过的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 万年历


21 乒乓球比赛

21.1 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
21.2 源程序

public class Compete {
    
    static char[] m = { 'a', 'b', 'c' };
    static char[] n = { 'x', 'y', 'z' };
 
    public static void main(String[] args) {
       for (int i = 0; i < m.length; i++) {
           for (int j = 0; j < n.length; j++) {
              if (m[i] == 'a' && n[j] == 'x') {
                  continue;
              } else if (m[i] == 'a' && n[j] == 'y') {
                  continue;
              } else if ((m[i] == 'c' && n[j] == 'x')
                     || (m[i] == 'c' && n[j] == 'z')) {
                  continue;
              } else if ((m[i] == 'b' && n[j] == 'z')
                     || (m[i] == 'b' && n[j] == 'y')) {
                  continue;
              } else
                  System.out.println(m[i] + " vs " + n[j]);
           }
       }
    }
}

21.3 运行结果:

a vs z
b vs x
c vs y


22 求分数之和

22.1 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

22.2 源程序

import java.text.DecimalFormat;
 
public class FenShu {
    public static void main(String[] args) {
       int x = 2, y = 1, t;
       double sum = 0;
 
       DecimalFormat df = new DecimalFormat("#0.0000");
 
       for (int i = 1; i <= 20; i++) {
           sum += (double) x / y;
           t = y;
           y = x;
           x = y + t;
           System.out.println("第 " + i + " 次相加,和是 " + df.format(sum));
       }
    }
}

22.3 运行结果:

第 1 次相加,和是 2.0000
第 2 次相加,和是 3.5000
第 3 次相加,和是 5.1667
第 4 次相加,和是 6.7667
第 5 次相加,和是 8.3917
第 6 次相加,和是 10.0071
第 7 次相加,和是 11.6261
第 8 次相加,和是 13.2437
第 9 次相加,和是 14.8619
第 10 次相加,和是 16.4799
第 11 次相加,和是 18.0980
第 12 次相加,和是 19.7160
第 13 次相加,和是 21.3340
第 14 次相加,和是 22.9521
第 15 次相加,和是 24.5701
第 16 次相加,和是 26.1881
第 17 次相加,和是 27.8062
第 18 次相加,和是 29.4242
第 19 次相加,和是 31.0422
第 20 次相加,和是 32.6603


23 求阶乘的和

23.1题目:求1+2!+3!+...+20!的和
23.2 源程序

public class JieCheng {
    static long sum = 0;
    static long fac = 0;
 
    public static void main(String[] args) {
       long sum = 0;
       long fac = 1;
       for (int i = 1; i <= 10; i++) {
           fac = fac * i;
           sum += fac;
       }
       System.out.println(sum);
    }
}

23.3 运行结果:

4037913


24 递归求法

24.1题目:利用递归方法求5!。
24.2 源程序

import java.util.Scanner;
 
public class DiGui {
    
    public static void main(String[] args) {
       Scanner s = new Scanner(System.in);
       int n = s.nextInt();
       DiGui tfr = new DiGui();
       System.out.println(tfr.recursion(n));
    }
 
    public long recursion(int n) {
       long value = 0;
       if (n == 1 || n == 0) {
           value = 1;
       } else if (n > 1) {
           value = n * recursion(n - 1);
       }
       return value;
    }
}

24.3 运行结果:

12
479001600

24.4 源程序揭秘

    递归公式:fn = (fn-1)+(fn-2)。


25 求不多于5的正整数

25.1题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

25.2 源程序

import java.util.Scanner;
 
public class ZhZhShu {
 
    public static void main(String[] args) {
 
       ZhZhShu tn = new ZhZhShu();
       Scanner s = new Scanner(System.in);
       long a = s.nextLong();
       if (a < 0 || a > 100000) {
           System.out.println("Error Input, please run this program Again");
           System.exit(0);
       }
 
       if (a >= 0 && a <= 9) {
           System.out.println(a + "是一位数");
           System.out.println("按逆序输出是" + '\n' + a);
       } else if (a >= 10 && a <= 99) {
           System.out.println(a + "是二位数");
           System.out.println("按逆序输出是");
           tn.converse(a);
       } else if (a >= 100 && a <= 999) {
           System.out.println(a + "是三位数");
           System.out.println("按逆序输出是");
           tn.converse(a);
       } else if (a >= 1000 && a <= 9999) {
           System.out.println(a + "是四位数");
           System.out.println("按逆序输出是");
           tn.converse(a);
       } else if (a >= 10000 && a <= 99999) {
           System.out.println(a + "是五位数");
           System.out.println("按逆序输出是");
           tn.converse(a);
       }
    }
 
    public void converse(long l) {
       String s = Long.toString(l);
       char[] ch = s.toCharArray();
       for (int i = ch.length - 1; i >= 0; i--) {
           System.out.print(ch[i]);
 
       }
    }
}

25.3 运行结果:

67
67是二位数
按逆序输出是
76


26 回文判断

26.1 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
26.2 源程序

import java.util.Scanner;
 
public class HuiWen {
    public static void main(String[] args) {
       Scanner s = new Scanner(System.in);
       System.out.print("请输入一个正整数:");
       long a = s.nextLong();
       String ss = Long.toString(a);
       char[] ch = ss.toCharArray();
       boolean is = true;
       int j = ch.length;
       for (int i = 0; i < j / 2; i++) {
           if (ch[i] != ch[j - i - 1]) {
              is = false;
           }
       }
       if (is == true) {
           System.out.println("这是一个回文数");
       } else {
           System.out.println("这不是一个回文数");
       }
    }
}

26.3 运行结果:

请输入一个正整数:12345654321
这是一个回文数


27 星期判断

27.1题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
27.2 源程序

import java.util.Scanner;
 
public class XingQi {
    Scanner s = new Scanner(System.in);
 
    public static void main(String[] args) {
       XingQi tw = new XingQi();
       char ch = tw.getChar();
       switch (ch) {
       case 'M':
           System.out.println("Monday");
           break;
       case 'W':
           System.out.println("Wednesday");
           break;
       case 'F':
           System.out.println("Friday");
           break;
       case 'T': {
           System.out.println("please input the second letter!");
           char ch2 = tw.getChar();
           if (ch2 == 'U') {
              System.out.println("Tuesday");
           } else if (ch2 == 'H') {
              System.out.println("Thursday");
           }
 
       }
           ;
           break;
       case 'S': {
           System.out.println("please input the scecond letter!");
           char ch2 = tw.getChar();
           if (ch2 == 'U') {
              System.out.println("Sunday");
           } else if (ch2 == 'A') {
              System.out.println("Saturday");
           }
 
       }
           ;
           break;
       }
    }
 
    public char getChar() {
       String str = s.nextLine();
       char ch = str.charAt(0);
       if (ch < 'A' || ch > 'Z') {
           System.out.println("Input error, please input a capital letter");
           getChar();
       }
       return ch;
    }
}

27.3 运行结果:

Monday
Monday


28 插数入数组

28.1题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

28.2 源程序

import java.util.Scanner;
 
public class ChaRu {
    public static void main(String[] args) {
       int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7 };
       int[] b = new int[a.length + 1];
       int t1 = 0, t2 = 0;
       int i = 0;
       Scanner s = new Scanner(System.in);
       int num = s.nextInt();
 
       if (num >= a[a.length - 1]) {
           b[b.length - 1] = num;
           for (i = 0; i < a.length; i++) {
              b[i] = a[i];
           }
       } else {
           for (i = 0; i < a.length; i++) {
              if (num >= a[i]) {
                  b[i] = a[i];
              } else {
                  b[i] = num;
                  break;
              }
           }
           for (int j = i + 1; j < b.length; j++) {
              b[j] = a[j - 1];
           }
       }
 
       for (i = 0; i < b.length; i++) {
           System.out.print(b[i] + " ");
       }
    }
}

28.3 运行结果:

3
1 2 3 3 4 5 6 7

28.4 源程序揭秘

    定义两个数组a,b,一个a的长度比另一个b大1,a看做是已经排好序的。接下来的过程是

如果num 比最后一个数大,把num赋值给数组b的最后一个数再按顺序把a 的每个元素赋给b

否则(num 不比a 的最后一个数大),如果a 的元素比num 小,则将这些元素按顺序赋给b,将num 赋给比num大的b数组的元素,跳出第一个for循环。

定义一个循环控制变量,从num传给数组后num的下标值加一开始;直到b的结尾,将剩下的a 的值赋给b,赋值的过程是b[j] = a[i-1]。


29 取整数的任意位

29.1题目:取一个整数a从右端开始的4~7位。
29.2 源程序

import java.util.Scanner;
 
public class QuWei {
 
    public static void main(String[] args) {
       Scanner s = new Scanner(System.in);
       boolean is = true;
       System.out.print("请输入一个7位以上的正整数:");
       long a = s.nextLong();
       String ss = Long.toString(a);
       char[] ch = ss.toCharArray();
       int j = ch.length;
       if (j < 7) {
           System.out.println("输入错误!");
       } else {
           System.out.println("截取从右端开始的4~7位是:" + ch[j - 7] + ch[j - 6]
                  + ch[j - 5] + ch[j - 4]);
       }
    }
}

29.3 运行结果:

请输入一个7位以上的正整数:123456789
截取从右端开始的4~7位是:3456

29.4 源程序揭秘

    先使a右移4位;设置一个低4位全为1,其余全为0的数。可用~(~0 < <4);将上面二者进行&运算。


30 按顺序输出数列

30.1题目:输入3个数a,b,c,按大小顺序输出

30.2 源程序

import java.util.Scanner;
 
public class ShunXu {
    public static void main(String[] args) {
       Scanner s = new Scanner(System.in);
       int a = s.nextInt();
       int b = s.nextInt();
       int c = s.nextInt();
 
       if (a < b) {
           int t = a;
           a = b;
           b = t;
       }
 
       if (a < c) {
           int t = a;
           a = c;
           c = t;
       }
 
       if (b < c) {
           int t = b;
           b = c;
           c = t;
       }
 
       System.out.println("从大到小的顺序输出:");
       System.out.println(a + " " + b + " " + c);
    }
}

30.3 运行结果:

34 23 89
从大到小的顺序输出:
89 34 23


    由于博客字数限制,40道程序设计课后习题总结将分4篇帖子进行总结,后面3篇帖子后面会一一贴出,或者可以在自己的博客下载已经总结完的全文 http://my.oschina.net/mkh/blog/340689,里面有全面详细的总结。


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


展开阅读全文
打赏
1
76 收藏
分享
加载中
更多评论
打赏
0 评论
76 收藏
1
分享
返回顶部
顶部