Java算法中级题练习

作者: 奔跑吧李博 | 来源:发表于2018-12-10 01:07 被阅读2次
1.求最大公约数和最小公倍数。
     /**
     * 求最大公约数
     */
    public static int gongyue(int a, int b) {
        int gongyue = 0;
        if (a < b) {  // 交换ab的值
            a = a + b;
            b = a - b;
            a = a - b;
        }
        if (a % b == 0) {
            gongyue = b;
        }
        while (a % b > 0) {
            a = a % b;
            if (a < b) {
                a = a + b;
                b = a - b;
                a = a - b;
            }
            if (a % b == 0) {
                gongyue = b;
            }
        }
        return gongyue;
    }

    /**
     * 求最小公倍数
     * @param a
     * @param b
     * @return
     */
    public static int gongbei(int a, int b) {
        return a*b/gongyue(a,b);
    }

    public static void main(String[] args) {
        System.out.println("最大公约数:" + gongyue(18, 12));
        System.out.println("最小公倍数:" + gongbei(18, 12));
    }
运行结果:
2.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:

将兔子的大小按生长月份规划,可以分为小中大,一个月大为小兔子,两个月大为中兔子,3个月及以上为大兔子。那么,每个月的大中小兔子数递推为:

月份 小兔子 中兔子 大兔子 总数
1 1 0 0 1
2 0 1 0 1
3 1 0 1 2
4 1 1 1 3
5 2 1 2 5
6 3 2 3 8
7 5 3 5 13

生长规律为:这个月中兔子为上一个月小兔子个数,这个月大兔子为上一个中兔子与大兔子的和,这个月小兔子个数为上个月大兔子数。
个数规律为:从第三个月起,每个月的个数为前两个月兔子数之和,即属于斐波那契数列,即得到如下calculateRabiit()函数。

    public static int calculateRabiit(int month) {
        if (month == 1 || month == 2) {
            return 1;
        } else {
            return calculateRabiit(month - 1) + calculateRabiit(month - 2);
        }
    }

    public static void main(String[] args) {
        for (int i = 1; i <= 20; i++) {
            System.out.println("第" + i + "个月有" + calculateRabiit(i) + "只兔子");
        }
    }
运行结果:
3.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
    public static void monkeyEadPeach() {
        int totalNum = 1;  //第10天为1个,依次倒着推前一天的桃子个数,直到第1天
        for (int i = 9; i >= 1; i--) {
            totalNum = (totalNum + 1) * 2;
        }
        System.out.println("桃子总共有" + totalNum + "个");
    }

    public static void main(String[] args) {
        monkeyEadPeach();
    }
运行结果:

桃子总共有1534个

4.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

分析:得出规律,下一项的分母是上一项的分子,下一项的分子是上一项的分母加分子。

    public static void addSum(){
        int a = 2;  //用a表示分子
        int b = 1;  //用b表示分母
        double totalSum = 0;
        for (int i = 0; i < 20; i++) {
            totalSum += (double) a / b;
            //改变a和b的值变为下一项的分子分母的值
            int temp = a;
            a = a + b;  //下一项的分子是上一项的分母加分子
            b = temp;  //下一项的分母是上一项的分子
        }
        DecimalFormat format = new DecimalFormat("#0.000");
        System.out.println("前20项之和为 " + format.format(totalSum));
    }
运行结果:

前20项之和为 32.660

5. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
    public static void fallDown() {
        float curPath = 100;
        float totalPath = 100;  //第一次下下落的高度
        totalPath += 100;  //第二次下落上弹的距离
        for (int i = 3; i <= 10; i++) {
            curPath = curPath / 2;  //当前次数经过的距离,每次距离为上次的一半,curPath为上下的距离之和
            totalPath += curPath;
        }
        float fantan = curPath / 2;
        System.out.println("总距离为" + totalPath + ",第10次反弹高度为" + fantan);
    }

    public static void main(String[] args) {
        fallDown();
    }
运行结果:

总距离为299.60938,第10次反弹高度为0.1953125

6.求1+2!+3!+...+10!的和
    public static void product() {
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            int num = 1;
            for (int j = 1; j <= i; j++) {
                //第i项式
                num *= j;
            }
            sum += num;
        }
        System.out.println("和为" + sum);
    }
结果为:

和为4037913

7.用递归的方式求n的阶乘
    public static int recursion(int n) {
        if (n > 1) {
            return n * recursion(n - 1);  //n的阶乘为n乘以前一个数的阶乘,依次向前递归调用,但是在为1时停止
        } else {
            return 1;
        }
    }

    public static void main(String[] args) {
        System.out.println("4的阶乘为" + recursion(4));
        System.out.println("5的阶乘为" + recursion(5));
        System.out.println("6的阶乘为" + recursion(6));
    }
结果为:
8.打印1000以内所有的水仙花数,水仙花数是指一个三位数,其各位数字立方和等于该数本身
 /**
     * 判断是不是水仙花数
     * @param i
     * @return
     */
    public static boolean isNarcissus(int i) {
        //设个位、十位、百位数字分别为a,b,c
        int c = i % 10;
        int b = i / 10 % 10;
        int a = i / 100;
        if (a * a * a + b * b * b +c * c * c == i) {
            return true;
        } else {
            return false;
        }
    }

    public static void printNarcissus() {
        for (int i = 100; i < 1000; i++) {
            if (isNarcissus(i)) {
                System.out.println(i);
            }
        }
    }

    public static void main(String[] args) {
        printNarcissus();
    }
运行结果为:
9.将一个正整数分解质因数。例如:输入90,打印出90=2 * 3 * 3 * 5。

程序分析:
一个数n,将n从2遍历到自身,找各个质因数。如果n % i == 0,则i为n的一个质因数。如果i==n,则说明已经找完了,否则继续递归调用分解n/i。

    public static void decompositionFactor(int n) {
        for (int i = 2; i <= n; i++) {
            if (n % i == 0) {
                //i为n的一个因数
                System.out.print(i);
                if (n != i) {
                    //未找完,还有其他因数
                    System.out.print(" * ");
                }
                decompositionFactor(n / i);
            }
        }
        System.exit(0);
    }

    public static void main(String[] args) {
        System.out.print(120 + " = ");
        decompositionFactor(120);
    }
运行结果:
120 = 2 * 2 * 2 * 3 * 5
10.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
    public static void statisticalCharacter() {
        System.out.println("请输入一行字符");
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        int enChar = 0;
        int spaceChar = 0;
        int num = 0;
        int otherChar = 0;
        for (int i = 0; i < string.length(); i++) {
            char character = string.charAt(i);
            //用ASCALL码值进行匹配
            if ((character >= 'A' && character <= 'Z') || (character >= 'a' && character <= 'z')) {
                enChar++;
            } else if (character == ' ') {
                spaceChar++;
            } else if (character >= '0' && character <= '9') {
                num++;
            } else {
                otherChar++;
            }
        }
        System.out.println("共有英文字母、空格、数字和其它字符个数分别为:" + enChar + "  " + spaceChar + "  " + num + "  " + otherChar);
    }

    public static void main(String[] args) {
        statisticalCharacter();
    }
运行结果:
11.求s = a + aa + aaa + aaaa + aa...a的值,需要键盘输入a和n的值,n表示共有多少项。

分析,每一项都为上一项的值乘以10,再加上a。
假设第一项为0,第二项为010 + a = a,第三项为a10+a=aa,第四项为
aa*10+a=aaa,依次类推。

/**
     * 
     * 例如输入a=2,n=5,打印出 2 + 22 + 222 + 2222 + 22222。
     */
    public static void printN() {
        System.out.println("请输入这个数a");
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        System.out.println("请输入n的值");
        int n = scanner.nextInt();
        int last = 0;  //上一个项式的值
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < n; i++) {
            last = last * 10 + a;
            if (i == n - 1) {
                stringBuffer.append(last);
            } else {
                stringBuffer.append(last + " + ");
            }
        }
        System.out.print(stringBuffer.toString());
    }

    public static void main(String[] args) {
        printN();
    }
运行结果:
12.一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数。
    public static boolean isPerfectNumber(int num) {
        int sum = 0;  //因子的和
        for (int i = 1; i <= num/2; i++) {
            if (num % i == 0) {  //遍历找出所有因子
                //i为num其中一个因子
                sum += i;
            }
        }
        if (sum == num) {
            return true;
        } else {
            return false;
        }
    }

    public static void printPunPerfectNumber() {
        for (int i = 1; i <= 1000; i++) {
            if (isPerfectNumber(i)) {
                StringBuffer sb = new StringBuffer();
                sb.append(i + " = ");
                for (int j = 1; j <= i/2; j++) {
                    if (i % j == 0) {
                        sb.append(j + " + ");
                    }
                }
                sb.deleteCharAt(sb.length()-2);  //去除最后一个"+"
                sb.append("\n");
                System.out.print(sb.toString());
            }
        }
    }

    public static void main(String[] args) {
        printPunPerfectNumber();
    }
运行结果:

13.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    public static void compositionFigure() {
        int totalCount = 0;  //总个数
        //从4个数里随机任选一个数出来,选3次
        for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= 4; j++) {
                for (int k = 1; k <= 4; k++) {
                    //此时确保互不相同,但需剔除重复数字情况
                    if (i == j || i == k || j == k) {
                        continue;
                    }
                    totalCount++;
                    System.out.println(i + "" + j + "" + k);
                }
            }
        }
        System.out.println("总个数有:" + totalCount + "个");
    }

    public static void main(String[] args) {
        compositionFigure();
    }
运行结果:

14.一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?
分析:一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数。这个数为num,那么就有num+100为一个整数n的平方,num+168为另一个整数m的平方,用%1为0的表达方式表示为一个整数。

    public static void perfectSquareNumber() {
        for (int i = 1; i <= 10000; i++) {
            if ((Math.sqrt(i + 100) % 1 == 0) && (Math.sqrt(i + 168) % 1 == 0)) {
                System.out.print("这个数是" + i);
            }
        }
    }

    public static void main(String[] args) {
        perfectSquareNumber();
    }
运行结果:

这个数是156

好了,以上就是练习题的主要内容,该文章会持续添加新题。

相关文章

  • Java算法中级题练习

    1.求最大公约数和最小公倍数。 运行结果: 2.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个...

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

  • freeCodeCamp 旅途9 - 算法中级

    算法中级:范围内的数字求和 算法中级:区分两个数组 算法中级:瞄准和消灭 算法中级:罗密欧与朱丽叶 算法中级:短线...

  • FCC编程题之中级算法篇(下)

    介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Sm...

  • FCC中级算法题solution

    1. Sum All Numbers in a Range 思路:1.判断两个数大小,大的赋给max,小的赋给mi...

  • FCC编程题之中级算法篇(中)

    介绍 接着上次的中级算法题 目录 1. Missing letters 2. Boo who 3. Sorted ...

  • 2019初中级会计押题库

    中级会计职称押题 中级会计职称押题 中级会计押题 中级会计职称考试押题 中级会计职称押题班 中级会计职称考前押题 ...

  • 2020年中级会计职称押题

    中级会计职称押题 中级会计职称押题 快手伊人会计 中级会计押题 中级会计职称考试押题 中级会计职称押题班 中级会计...

  • 2019中级会计职称考试押题

    中级会计职称押题 中级会计押题 中级会计职称考试押题 中级会计职称押题班 中级会计职称考前押题 中级会计职称财务管...

  • 2019中级会计押题,善良押题

    中级会计职称押题 中级会计押题 中级会计职称考试押题 中级会计职称押题班 中级会计职称考前押题 中级会计职称财务管...

网友评论

    本文标题:Java算法中级题练习

    本文链接:https://www.haomeiwen.com/subject/azxpqqtx.html