算法入门第二章练习题

Posted leonardo-xx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门第二章练习题相关的知识,希望对你有一定的参考价值。

 

习题2-1 水仙花数

输出100~999中的所有水仙花数。若3位数ABC满足ABC=A2+B2+C2,则称其为水仙花数。例如:153=12+52+32,所以153是水仙花数。

解析:只有1000个数,直接暴搜就好了。

 

 1 public class Q21 {
 2     public static void main(String[] args) {
 3         for (int i = 1; i < 10; i++) {
 4             for (int j = 0; j < 10; j++) {
 5                 for (int k = 0; k < 10; k++) {
 6                     int sum = i * 100 + j * 10 + k;
 7                     if(sum==Math.pow(i,3)+Math.pow(j,3)+Math.pow(k,3))
 8                         System.out.println(sum);
 9                 }
10             }
11         }
12     }
13 }

知道有一天我看见了

#include <cstdio>
int main (void)
{
    int first = 1;
    for (int i = 100; i < 1000; i++)
    {
        int c = i%10;
        int b = i/10%10;
        int a = i/100;
        if (a*a*a+b*b*b+c*c*c == i)
        {
            if (first)
                first = 0;
            else
                printf (" ");
            printf ("%d",i);
        }
    }
    return 0;
}

 

      int c = i%10;
        int b = i/10%10;
        int a = i/100;
       
第一次知道 还能这么用一个循环得出三个数
再次强化一个概念 / 取前 %取后

习题2-2 韩信点兵

 

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解,即输出No answer)。已知总人数不小于10,不超过100.输入到文件结束为止。

样例输入:

2 1 6

2 1 3

样例输出:

Case 1: 41

Case 2:No answer

 

除了枚举还有一个 

算统的方法 但是感觉有点复杂 就不理解了  

大道至简 解决就好 贴在后面  愿意了解就看看

 

三人同行七十稀,

五数梅花甘一枝,

七子团圆正半月,

除百零五便得知。

甘一是21,正半月是15,除百零五的意思就是求105的余数。可以发现70是5和7的最小公倍数,21是3和7的最小公倍数,15是3和5的最小公倍数,105是3、5、7的最小公倍数。因此这四句口诀的意思就是用任意两数的最小公倍数乘第三个数并求和,对和求105的余数即可得到答案

 

输入正整数n≤20,输入一个n层的倒三角形。例如,n=5时输出如下:

#########

#######

  #####

  ###

    #

import java.util.Scanner;

public class Q22 {
    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        int n = scanner.nextInt();
        int n = 5;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                System.out.printf(" ");
            }
            int k = 2 * (n - i) - 1;
            for (int z = 0; z<k; z++)
                System.out.printf("*");

            System.out.println("");
        }
    }
}

和网上的差不多 但是循环套循环 感觉要加强一下 说懂也懂 不懂也很懵

!重新理解一下 循环条件

满足进 不满足不进 

 

 

输入两个正整数,n<m<106,输出1/n2+1/(n+1)2+...+1/m2,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。

样例输入:

2 4

65536 655360

0 0

样例输出:

Case 1: 0.42361

Case 2: 0.00001

public class Q24 {

    public static void main(String[] args) {
        double m = 4.0, n = 2.0;
        double sum = 0.0;
        for (double i = n; i <= m; i++) {
            sum += 1 / i * i;
        }
        System.out.println(sum);
    }
}

 

习题2-6 排列

用 1,2,3…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。

解析:因为搜索范围是100~999而已,所以提示的意思大概就是让我们直接用暴搜找出符合条件的数就好了。即使是暴搜我们还是可以将范围再缩小一点,根据题目要求,可以用到的最小的数(作为abc)是123,最大的数(作为ghi)是987,由最大数可以根据3个数的比例推算出最小数abc的上限为987÷3=329,因此最小数abc的范围是123~329(如果不缩小范围还需要加一个判断ghi是否大于1000的判断条件,稍加思考即可发现超过329的三位数abc绝大部分对应的三位数ghi都超过了1000,不缩小范围浪费了很多时间)。题目要求1~9这9个数字不能每个只能出现一次,那么输出条件就是三个三位数拆分后的和要正好等于45(1+2+…+9=45)。

public class Q26 {
    public static void main(String[] args) {
        for (int i = 123; i <= 329; i++) {
            int j = i * 2;
            int k = i * 3;
            if (isOK(j) == 1 && isOK(k) == 1 &&is2OK(i,j)==1&&is2OK(i,k)==1&&is2OK(j,k)==1){
                System.out.printf(i + " " + i * 2 + " " + i * 3);
                System.out.println();
            }

        }
    }

    private static int isOK(int num) {
        if (num > 100 && num < 999) {
            if (num / 100 != num / 10 % 10 && num / 100 != num % 10 && num / 10 % 10 != num % 10)
                return 1;
            else
                return 0;
        } else
            return 0;
    }

    private static int is2OK(int n1, int n2) {
        int hun1 = n1 / 100;
        int dec1 = n1 / 10 % 10;
        int uni1 = n1 % 10;
        int hun2 = n2 / 100, dec2 = n2 / 10 % 10, uni2 = n2 % 10;
        if (hun1 != hun2 && hun1 != dec2 && hun1 != uni2 & dec1 != hun2 && dec1 != dec2 && dec1 != uni2 && uni1 != hun2 && uni1 != dec2 && uni1 != uni2)
            return 1;
        else
            return 0;

    }
}

 

功能函数化 很有用 很屌

 





以上是关于算法入门第二章练习题的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛入门经典(第二版)》习题解答——第二章

2021算法竞赛入门班第二节课递归分治二分练习题

机器学习入门 KNN分类算法 | 附加小练习

[算法竞赛入门]第二章_循环结构程序设计

☀️机器学习入门☀️ 图解K-Means聚类算法 | 附加小练习

片段(Java) | 机试题+算法思路+考点+代码解析 2023