算法竞赛一些基础问题的复习(java) 1(大水仙花数、韩信点兵、倒三角、排列)

13 篇文章 0 订阅

关于算法竞赛一些基础问题,也就是《算法竞赛入门经典》第二版的第二章习题,用java再打一遍,附上一些问题的代码,方便自己调用。
1.水仙花数(daffodil)
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花 数。例如153=13+53+33,所以153是水仙花数。

        int a,b,c;
        for(int i=100;i<=999;i++){
            a=i/100;
            b=i/10%10;
            c=i%10;
            if(a*a*a+b*b*b+c*c*c==i){
                System.out.println(i);//i为水仙花数
            }
        }

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

        Scanner z = new Scanner(System.in);
        int a, b, c, i;//i为总人数
        a = z.nextInt();
        b = z.nextInt();
        c = z.nextInt();
        for (i = 10; i <= 100; i++) {
            if (i % 3 == a && i % 5 == b && i % 7 == c) {
                System.out.println(i);
                break;
            }
        }
        if (i == 101) {
            System.out.println("no answer");
        }

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

        Scanner z = new Scanner(System.in);
        int i, j, k, n;
        n = z.nextInt();
        for (i = n; i > 0; i--) {
            for (k = 0; k < n - i; k++) {
                System.out.print(" ");
            }
            for (j = 0; j < 2 * i - 1; j++) {
                System.out.print("#");
            }
            System.out.println();
        }

4.排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

//个人用数组返回,应该有更简单的方法
int i, j, k ;
        for (i = 123; i <= 329; i++) {//i最小为123,最大为329
            j = i * 2;
            k = i * 3;
            int sum = 0, mul = 1;
            int[] sumMul = { sum, mul };
            sumMul = result(i, sumMul[0], sumMul[1]);
            sumMul = result(j, sumMul[0], sumMul[1]);
            sumMul = result(k, sumMul[0], sumMul[1]);
            if (sumMul[0] == 45 && sumMul[1] == 362880) {
                System.out.println(i + " " + j + " " + k);
            }
        }
    }

    static int[] result(int m, int sum, int mul) {
        int i = m / 100;
        int j = m / 10 % 10;
        int k = m % 10;
        sum += i + k + j;
        mul *= i * j * k;
        int[] summul = { sum, mul };
        return summul;
    }

总结:是些比较简单的例题,但是从头再敲一遍,却用了近半个小时,应该对较简单的循环更具有熟练度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值