文档章节

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

闵开慧
 闵开慧
发布于 2014/11/12 10:50
字数 3054
阅读 1762
收藏 158

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

 

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

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

 

© 著作权归作者所有

闵开慧
粉丝 334
博文 608
码字总数 269647
作品 0
青浦
高级程序员
私信 提问
加载中

评论(7)

李华12138
李华12138
←_←
李华12138
李华12138
这不是学C的都会做的题目吗?
sb_gikieng
sb_gikieng
这兔子单性繁殖?
开源中国首席之首席
开源中国首席之首席
第一个就斐波拉契就错了
牛奋Debug
牛奋Debug
good work
gtd
gtd
好!
java9
java9
can't zan any more
OSChina 技术周刊第九期 —— 每周技术精选,值得一看!

每周技术抢先看,总有你想要的! 移动开发 【翻译】介绍 Visual Studio 的 Android 模拟器 【博客】手机腾讯网mt框架之mtwebapp示例解析。 【博客】《Android深入透析》之常用设计模式经验谈...

OSC编辑部
2014/11/16
4K
4
Joel Spolsky在耶鲁大学的演讲(上)

Joel Spolsky是一个美国的软件工程师,他的网络日志"Joel谈软件"(Joel on Software)非常有名,读者人数可以排进全世界前100名。 上个月28号,他回到母校耶鲁大学,与计算机系的学生座谈。他...

阮一峰
2007/12/12
0
0
Coursera公开课《机器学习基石&技术》课程的感触

背景 最近在修台湾大学林轩田老师在Coursera上的机器学习系列课程《机器学习基石》和《机器学习技术》,前者是后者的先行课程,是基础,后者是前者的升级与补充。一直都有一个想法,就是完成...

练绪宝
2015/02/13
0
0
Security+认证考试心得分享(三)

经验: 因为从事安全方面工作,这次考试复习不太过关,吃老底比较多哈,不过通过对security+学习和考试还是了解了很多新的知识点,还是非常有益处的。 1)复习过程:课本一遍、习题册自己做一...

悠悠啊
2018/08/03
0
0
新手如何学习C语言/C++,我用一年时间是怎么自学的

最近会有一些初中高中大学的同学问,C语言C++不会不知道怎么学习不会写代码怎么办?大致上都是一些类似的问题吧,回想一下自己走过的路,反复的了很久思考然后写了这篇文章,希望可以对一些迷...

小辰GG
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

lombok的一个踩坑记录

lombok的类如下所示: package com.divx.service.model.task;import com.divx.service.model.BaseTypeMedia;import lombok.Data;/** * @author wuzhilang * @Title: QuestionResult ......

无知的小狼
25分钟前
0
0
如何使用markdown

我没有导入相应的包 这个用的还是有些问题 而且显示的时候格式问题还没解决 <div class="blog_editor" style="margin: 0 auto;width:60%;height:1000px;background-color: white;"> <div s......

南桥北木
28分钟前
0
0
纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。 代码实现。 1.pom.xml文件,需要依赖的jar...

Java老王
30分钟前
0
0
Presto查询引擎简单分析

Hive查询流程分析 各个组件的作用 UI(user interface)(用户接口):提交数据操作的窗口 Driver(引擎):负责接收数据操作,实现了会话句柄,并提供基于JDBC / ODBC的execute和fetch API Metas...

MobService
31分钟前
0
0
《软件架构的10个常见模式》,看完真心觉得不错

作者:半吊子全栈工匠原文链接:https://blog.csdn.net/wireless_com/article/details/89008061 企业规模的软件系统该如何设计呢?在开始写代码之前,我们需要选择一个合适的架构,这个架构...

Java干货分享
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部