zoukankan      html  css  js  c++  java
  • 曾经做过的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("
    素数的个数:" + 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语句,条件为输入的字符不为 ' '。

    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种比较高效常用的排序算法

        》如何获取系统信息

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

  • 相关阅读:
    Ajax原生XHR对象
    node-sass报错解决方法
    AngularJS中的表单验证
    javaScirpt事件详解-原生事件基础(一)
    jQuery Ajax总结
    Ruby 方法
    JS中常遇到的浏览器兼容问题和解决方法
    History对象
    转码与解码
    Location对象
  • 原文地址:https://www.cnblogs.com/minkaihui/p/4091496.html
Copyright © 2011-2022 走看看