曾经做过的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,里面有全面详细的总结。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

51 Nod 1028 大数乘法 V2【Java大数乱搞】

1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果。 Inpu...

2694
来自专栏人工智能LeadAI

讨厌算法的程序员 | 第五章 合并算法

本篇介绍的“合并”算法,是为后面学习“归并排序”的一个准备。合并算法是归并排序中的一个子算法,请注意两者之间的关系和差异。 之所以把它独立成一篇,一方面是一旦了...

3655
来自专栏偏前端工程师的驿站

基础野:细说无符号整数

Brief                                 本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004...

2056
来自专栏数据结构与算法

P3808 【模版】AC自动机(简单版)

题目背景 这是一道简单的AC自动机模版题。 用于检测正确性以及算法常数。 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交。 题目描述 给定n个模...

2786
来自专栏数说工作室

【SAS Says】基础篇:5. 开发数据(一)

本节目录: 开发数据 5.1 创建并重新定义变量 5.2 使用SAS函数 5.3 使用IF-THEN语句 5.4 用IF-THEN语句将观测值分组 5.5 构造...

3224
来自专栏数据结构与算法

24:蛇形填充数组

24:蛇形填充数组 总时间限制: 1000ms 内存限制: 65536kB描述 用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。 ...

3716
来自专栏ml

HDUOJ-----(1251)统计难题

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Jav...

3639
来自专栏GIS讲堂

geotools等值线生成

前文中,提到了等值面的生成,后面有人经常会问等值线的生成,本文在前文的基础上做了一点修改,完成了等值线的geotools生成。

2935
来自专栏小樱的经验随笔

2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】

Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768...

2864
来自专栏TensorFlow从0到N

讨厌算法的程序员 5 - 合并算法

本篇介绍的“合并”算法,是为后面学习“归并排序”的一个准备。合并算法是归并排序中的一个子算法,请注意两者之间的关系和差异。 之所以把它独立成一篇,一方面是一旦...

3455

扫码关注云+社区

领取腾讯云代金券