经典算法50例

【题目1】有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,则每个月的兔子总数为多少。

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = 1; i <= 20; i++) {
            System.out.println(function(i));
        }
    }

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

【题目2】判断101-200之间有多少个素数,并输出所有素数。

package leif;

public class Test {
    public static void main(String[] args) {
        label: for (int i = 101; i <= 200; i++) {
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    continue label;
                }
            }

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

【题目3】打印出所有的水仙花数。所谓水仙花数,是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = 100; i <= 999; i++) {
            if (i == Math.pow(i / 100, 3) + Math.pow(i / 10 % 10, 3) + Math.pow(i % 10, 3)) {
                System.out.println(i);
            }
        }
    }
}

【题目4】将一个正整数分解质因数。例如:输入90,打印出90 = 2 * 3 * 3 * 5

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();
        StringBuilder stringBuilder = new StringBuilder(number + " = ");

        for (int i = 2; i <= Math.sqrt(number); i++) {
            if (number % i == 0) {
                stringBuilder.append(i + " * ");
                number /= i;
                i--;
            }
        }

        stringBuilder.append(number);
        System.out.println(stringBuilder);
        scanner.close();
    }
}

【题目5】利用条件运算符的嵌套来完成此题:90分及以上的同学用A表示,60~89分之间的用B表示,60分以下的用C表示。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int score = scanner.nextInt();
        System.out.println(score > 100 || score < 0 ? "Error" : score >= 90 ? "A" : score >= 60 ? "B" : "C");
        scanner.close();
    }
}

【题目6】输入两个正整数m和n,求其最大公约数和最小公倍数。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int greatestCommonDivisor = function(m, n);
        int leastCommonMultiple = m * n / greatestCommonDivisor;
        System.out.println("最大公约数:" + greatestCommonDivisor + "\n最小公倍数:" + leastCommonMultiple);
        scanner.close();
    }

    public static int function(int m, int n) {
        while (true) {
            if ((m = m % n) == 0) {
                return n;
            }

            if ((n = n % m) == 0) {
                return m;
            }
        }
    }
}

【题目7】输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package leif;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        Map<String, Integer> sIMap = new HashMap<String, Integer>();
        sIMap.put("letter", 0);
        sIMap.put("whitespace", 0);
        sIMap.put("digit", 0);
        sIMap.put("other", 0);

        for (char c : s.toCharArray()) {
            if (Character.isLetter(c)) {
                sIMap.put("letter", sIMap.get("letter") + 1);
            } else if (Character.isWhitespace(c)) {
                sIMap.put("whitespace", sIMap.get("whitespace") + 1);
            } else if (Character.isDigit(c)) {
                sIMap.put("digit", sIMap.get("digit") + 1);
            } else {
                sIMap.put("other", sIMap.get("other") + 1);
            }
        }

        System.out.println(sIMap);
        scanner.close();
    }
}

【题目8】求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字,几个数相加由键盘控制。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int a = scanner.nextInt();
        int temp = a;
        int sum = a;

        for (int i = 1; i < n; i++) {
            a = a * 10 + temp;
            sum += a;
        }

        System.out.println(sum);
        scanner.close();
    }
}

【题目9】一个数如果恰好等于它的因子之和,这个数就称为完数,例如6 = 1 + 2 + 3。编程找出1000以内的所有完数。

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = 1; i < 1000; i++) {
            int sum = 0;

            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    sum += j;
                }
            }

            if (i == sum) {
                System.out.println(i);
            }
        }
    }
}

【题目10】一球从100米高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时,共经过多少米,第10次反弹多高。

package leif;

public class Test {
    public static void main(String[] args) {
        double s = 0;
        double h = 100;

        for (int i = 1; i <= 10; i++) {
            s += h;
            h /= 2;
            s += h;
        }

        System.out.println("经过路程:" + (s - h));
        System.out.println("反弹高度:" + h);
    }
}

【题目11】有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

package leif;

public class Test {
    public static void main(String[] args) {
        int counter = 0;

        for (int a = 1; a <= 4; a++) {
            for (int b = 1; b <= 4; b++) {
                for (int c = 1; c <= 4; c++) {
                    if (a != b && b != c && c != a) {
                        System.out.println("" + a + b + c);
                        counter++;
                    }
                }
            }
        }

        System.out.println(counter);
    }
}

【题目12】企业发放的奖金根据利润提成,利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时,高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%;高于100万元时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数?

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double I = scanner.nextDouble();
        double bonus = I > 10 ? I > 20 ? I > 40 ? I > 60 ? I > 100 ? function100_(I) : function60_100(I) : function40_60(I) : function20_40(I) : function10_20(I) : function_10(I);
        System.out.println(bonus);
        scanner.close();
    }

    public static double function_10(double I) {
        return I * 0.1;
    }

    public static double function10_20(double I) {
        return (I - 10) * 0.075 + function_10(10);
    }

    public static double function20_40(double I) {
        return (I - 20) * 0.05 + function10_20(20);
    }

    public static double function40_60(double I) {
        return (I - 40) * 0.03 + function20_40(40);
    }

    public static double function60_100(double I) {
        return (I - 60) * 0.015 + function40_60(60);
    }

    public static double function100_(double I) {
        return (I - 100) * 0.01 + function60_100(100);
    }
}

【题目13】一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = -100; i <= 10000; i++) {
            if (Math.sqrt(i + 100) % 1 == 0) {
                if (Math.sqrt(i + 100 + 168) % 1 == 0) {
                    System.out.println(i);
                }
            }
        }
    }
}

【题目14】输入某年某月某日,判断这一天是这一年的第几天。

package leif;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String date = scanner.next();
        Calendar calendar = Calendar.getInstance();

        try {
            calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(date));
            System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
        } catch (ParseException e) {
            e.printStackTrace();
        } finally {
            scanner.close();
        }
    }
}

【题目15】输入三个整数x、y、z,请把这三个数由小到大输出。

package leif;

import java.util.Arrays;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        int z = scanner.nextInt();
        int[] is = {x, y, z};
        Arrays.sort(is);
        System.out.println(Arrays.toString(is));
        scanner.close();
    }
}

【题目16】打印九九乘法表。

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + " * " + i + " = " + (i * j) + "\t");
            }

            System.out.println();
        }
    }
}

【题目17】猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

package leif;

public class Test {
    public static void main(String[] args) {
        int peach = 1;

        for (int i = 9; i >= 1; i--) {
            peach = (peach + 1) * 2;
        }

        System.out.println(peach);
    }
}

【题目18】两个乒乓球队进行比赛,各出三人,甲队为a、b、c三人,乙队为x、y、z三人,已抽签决定比赛名单。有人向队员打听比赛的名单,a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

package leif;

public class Test {
    public static void main(String[] args) {
        char[] m = {'a', 'b', 'c'};
        char[] n = {'x', 'y', 'z'};

        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < n.length; j++) {
                if ((m[i] == 'a' && n[j] == 'x') || (m[i] == 'a' && n[j] == 'y')) {
                    continue;
                } else if ((m[i] == 'b' && n[j] == 'y') || (m[i] == 'b' && n[j] == 'z')) {
                    continue;
                } else if ((m[i] == 'c' && n[j] == 'x') || (m[i] == 'c' && n[j] == 'z')) {
                    continue;
                } else {
                    System.out.println(m[i] + " vs " + n[j]);
                }
            }
        }
    }
}

【题目19】打印出如下图案(菱形)

   *
  ***
 *****
*******
 *****
  ***
   *
package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();

        for (int row = 1; row <= i; row++) {
            for (int col = 1; col <= Math.abs((i + 1) / 2 - row); col++) {
                System.out.print(" ");
            }

            for (int col = 1; col <= i - 2 * Math.abs((i + 1) / 2 - row); col++) {
                System.out.print("*");
            }

            System.out.println();
        }

        scanner.close();
    }
}

【题目20】有一分数序列:2/1、3/2、5/3、8/5、13/8、21/13……求出这个数列的前20项之和。

package leif;

public class Test {
    public static void main(String[] args) {
        double sum = 0;

        for (int i = 1; i <= 20; i++) {
            sum += getNumerator(i) / getDenominator(i);
        }

        System.out.println(sum);
    }

    public static double getNumerator(int numerator) {
        if (numerator == 1) {
            return 2;
        } else if (numerator == 2) {
            return 3;
        } else {
            return getNumerator(numerator - 1) + getNumerator(numerator - 2);
        }
    }

    public static double getDenominator(int denominator) {
        if (denominator == 1) {
            return 1;
        } else if (denominator == 2) {
            return 2;
        } else {
            return getNumerator(denominator - 1) + getNumerator(denominator - 2);
        }
    }
}

【题目21】求1! + 2! + 3! + … + 20!的和。

package leif;

public class Test {
    public static void main(String[] args) {
        int sum = 0;

        for (int i = 1; i <= 20; i++) {
            sum += getFactorial(i);
        }

        System.out.println(sum);
    }

    public static int getFactorial(int number) {
        if (number == 1) {
            return 1;
        } else {
            return number * getFactorial(number - 1);
        }
    }
}

【题目22】利用递归方法求5!。

package leif;

public class Test {
    public static void main(String[] args) {
        System.out.println(getFactorial(5));
    }

    public static int getFactorial(int number) {
        if (number == 1) {
            return 1;
        } else {
            return number * getFactorial(number - 1);
        }
    }
}

【题目23】有五个人坐在一起,问第5个人的岁数,他说比第4个人大两岁,问第4个人的岁数,他说比第3个人大两岁,问第三个人的岁数,他说比第2个人大两岁,问第2个人的岁数,他说比第1个人大两岁,最后问第1个人,他说是10岁。请问第五个人多大?

package leif;

public class Test {
    public static void main(String[] args) {
        int age = 10;

        for (int i = 4; i >= 1; i--) {
            age +=2;
        }

        System.out.println(age);
    }
}

【题目24】输入一个不多于5位的正整数,求它是几位数并逆序打印出各位数字。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = 10000;

        while ((i = scanner.nextInt()) >= 10000 || i <= 0) {
            System.out.println("输入一个不多于5位的正整数");
        }

        StringBuilder stringBuilder = new StringBuilder(i + "");
        System.out.println(stringBuilder.length());
        System.out.println(stringBuilder.reverse());
        scanner.close();
    }
}

【题目25】输入一个5位数,判断它是不是回文数。即个位与万位相同、十位与千位相同。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = 0;

        while ((i = scanner.nextInt()) > 99999 || i < 10000) {
            System.out.println("输入一个5位数");
        }

        StringBuilder stringBuilder = new StringBuilder(i + "");
        System.out.println(stringBuilder.toString().equals(stringBuilder.reverse().toString()) ? "是回文数" : "不是回文数");
        scanner.close();
    }
}

【题目26】请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入第一个字母:");
        String letter1 = scanner.next();

        switch (letter1) {
            case "m":
            case "M":
                System.out.println("星期一");
                break;
            case "t":
            case "T":
                System.out.print("请输入第二个字母:");
                String letter2 = scanner.next();

                switch (letter2) {
                    case "u":
                    case "U":
                        System.out.println("星期二");
                        break;
                    case "h":
                    case "H":
                        System.out.println("星期四");
                        break;
                    default:
                        System.out.println("Error");
                        break;
                }

                break;
            case "w":
            case "W":
                System.out.println("星期三");
                break;
            case "f":
            case "F":
                System.out.println("星期五");
                break;
            case "s":
            case "S":
                System.out.print("请输入第二个字母:");
                String letter3 = scanner.next();

                switch (letter3) {
                    case "a":
                    case "A":
                        System.out.println("星期六");
                        break;
                    case "u":
                    case "U":
                        System.out.println("星期日");
                        break;
                    default:
                        System.out.println("Error");
                        break;
                }

                break;
            default:
                System.out.println("Error");
                break;
        }

        scanner.close();
    }
}

【题目27】求100之内的素数。

package leif;

public class Test {
    public static void main(String[] args) {
        label: for (int i = 2; i < 100; i++) {
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    continue label;
                }
            }

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

【题目28】对10个数进行排序。

package leif;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] is = new int[10];

        for (int i = 0; i < is.length; i++) {
            is[i] = (int) (Math.random() * 100 + 1);
        }

        System.out.println(Arrays.toString(is));
        Arrays.sort(is);
        System.out.println(Arrays.toString(is));
    }
}

【题目29】求一个3*3矩阵对角线元素之和。

package leif;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[][] iss = new int[3][3];

        for (int i = 0; i < iss.length; i++) {
            for (int j = 0; j < iss[i].length; j++) {
                iss[i][j] = (int) (Math.random() * 100 + 1);
            }
        }

        System.out.println(Arrays.deepToString(iss));
        int sum = 0;

        for (int i = 0; i < iss.length; i++) {
            for (int j = 0; j < iss[i].length; j++) {
                if (i == j) {
                    sum += iss[i][j];
                }
            }
        }

        System.out.println(sum);
    }
}

【题目30】有一个已经排好序的数组,现输入一个数,要求按原来的规律将它插入数组中。

package leif;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Integer[] is = new Integer[10];

        for (int i = 0; i < is.length; i++) {
            is[i] = (int) (Math.random() * 100 + 1);
        }

        System.out.println(Arrays.toString(is));
        Arrays.sort(is);
        System.out.println(Arrays.toString(is));
        Integer[] newIs = new Integer[is.length + 1];
        System.arraycopy(is, 0, newIs, 0, is.length);
        newIs[newIs.length - 1] = scanner.nextInt();
        boolean isASC = false;

        for (int i = 0; i < is.length; i++) {
            if (is[i] == is[i + 1]) {
                continue;
            }

            if (is[i] < is[i + 1]) {
                isASC = true;
            }

            break;
        }

        if (isASC) {
            Arrays.sort(newIs);
        } else {
            Arrays.sort(newIs, new Comparator<Integer>() {
                @Override
                public int compare(Integer i1, Integer i2) {
                    return i2 - i1;
                }
            });
        }

        System.out.println(Arrays.toString(newIs));
        scanner.close();
    }
}

【题目31】将一个数组逆序输出。

package leif;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] is = new int[10];

        for (int i = 0; i < is.length; i++) {
            is[i] = (int) (Math.random() * 100 + 1);
        }

        System.out.println(Arrays.toString(is));

        for (int i = is.length - 1; i >= 0; i--) {
            System.out.print(is[i] + " ");
        }
    }
}

【题目32】取一个整数a从右端开始的4~7位。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        String string = String .valueOf(i);
        System.out.println(string.substring(string.length() - 7, string.length() - 4 + 1));
        scanner.close();
    }
}

【题目33】打印出杨辉三角形。

package leif;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int numRows = scanner.nextInt();
        List<List<Integer>> rowList = new ArrayList<List<Integer>>();

        for (int row = 0; row < numRows; row++) {
            List<Integer> colList = new ArrayList<Integer>();

            for (int col = 0; col <= row; col++) {
                if (col == 0 || row == col) {
                    colList.add(1);
                } else {
                    colList.add(rowList.get(row - 1).get(col) + rowList.get(row - 1).get(col - 1));
                }
            }

            rowList.add(colList);
        }

        for (List<Integer> iList : rowList) {
            System.out.println(iList);
        }

        scanner.close();
    }
}

【题目34】输入3个数a、b、c,按大小顺序输出。

package leif;

import java.util.Arrays;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] is = new int[3];
        is[0] = scanner.nextInt();
        is[1] = scanner.nextInt();
        is[2] = scanner.nextInt();
        Arrays.sort(is);
        System.out.println(Arrays.toString(is));
        scanner.close();
    }
}

【题目35】输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

package leif;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] is = new int[10];

        for (int i = 0; i < is.length; i++) {
            is[i] = (int) (Math.random() * 100 + 1);
        }

        System.out.println(Arrays.toString(is));

        int maxIndex = 0;
        int minIndex = 0;

        for (int i = 0; i < is.length; i++) {
            if (is[i] > is[maxIndex]) {
                maxIndex = i;
            }

            if (is[i] < is[minIndex]) {
                minIndex = i;
            }
        }

        if (maxIndex != 0) {
            is[0] = is[0] ^ is[maxIndex];
            is[maxIndex] = is[0] ^ is[maxIndex];
            is[0] = is[0] ^ is[maxIndex];
        }

        if (minIndex != is.length - 1) {
            is[is.length - 1] = is[is.length - 1] ^ is[minIndex];
            is[minIndex] = is[is.length - 1] ^ is[minIndex];
            is[is.length - 1] = is[is.length - 1] ^ is[minIndex];
        }

        System.out.println(Arrays.toString(is));
    }
}

【题目36】有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。例:1、2、3、4、5后移动2个位置变成:4、5、1、2、3。

package leif;

import java.util.LinkedList;
import java.util.Queue;

public class Test {
    public static void main(String[] args) {
        Queue<Integer> iQueue = new LinkedList<Integer>();

        int n = (int) (Math.random() * 10 + 1);
        System.out.println(n);

        for (int i = 0; i < n; i++) {
            iQueue.offer((int) (Math.random() * 100 + 1));
        }

        System.out.println(iQueue);

        int m = (int) (Math.random() * 10 + 1);
        System.out.println(m);

        for (int i = 0; i < m; i++) {
            iQueue.offer(iQueue.poll());
        }

        System.out.println(iQueue);
    }
}

【题目37】约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。问最后留下的是原来的第几号。

package leif;

import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> iList = new LinkedList<Integer>();
        int n = (int) (Math.random() * 10 + 1);
        System.out.println(n);

        for (int i = 1; i <= n; i++) {
            iList.add(i);
        }

        int k = (int) (Math.random() * 10 + 1);
        System.out.println(k);
        int m = (int) (Math.random() * 10 + 1);
        System.out.println(m);

        while (iList.size() > 1) {
            System.out.println(iList);
            k = (k + m - 1) % n;

            if (k == 0) {
                k = iList.size();
            }

            iList.remove(k - 1);
            n -= 1;
        }

        System.out.println(iList);
    }
}

【题目38】编写一个方法求一个字符串的长度。

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println(function(scanner.nextLine()));
        scanner.close();
    }

    public static int function(String s) {
        return s.length();
    }
}

【题目39】编写一个方法,当n为偶数时,调用方法求1/2 + 1/4 + … + 1/n,当n为奇数时,调用方法求1/1 + 1/3 + … + 1/n

package leif;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println(function(scanner.nextInt()));
        scanner.close();
    }

    public static double function(int n) {
        double sum = 0;

        if (n % 2 == 0) {
            for (int i = 2; i <= n; i += 2) {
                sum += 1.0 / i;
            }
        } else {
            for (int i = 1; i <= n; i += 2) {
                sum += 1.0 / i;
            }
        }

        return sum;
    }
}

【题目40】字符串排序。

package leif;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        Random random = new Random();
        List<String> sList = new ArrayList<String>();

        for (int i = 1; i <= 10; i++) {
            StringBuilder stringBuilder = new StringBuilder();

            for (int j = 1; j <= 10; j++) {
                stringBuilder.append((char) random.nextInt(128));
            }

            sList.add(stringBuilder.toString());
        }

        System.out.println(sList);
        Collections.sort(sList);
        System.out.println(sList);
    }
}

【题目41】海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份;第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份。第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

package leif;

public class Test {
    public static void main(String[] args) {
        int sum = 6;

        for (int i = 4; i >= 1; i--) {
            sum = sum * 5 + 1;
        }

        System.out.println(sum);
    }
}

【题目42】已知809 * ?? = 800 * ?? + 9 * ??,其中??代表的两位数,8 * ??的结果为两位数,9 * ??的结果为3位数。求??代表的两位数及809 * ??后的结果。

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = 12; i <= 12; i++) {
            if (809 * i == 800 * i + 9 * i) {
                System.out.println(i + " " + (809 * i));
            }
        }
    }
}

【题目43】求0~7所能组成的奇数个数(数字不能重复)。

package leif;

public class Test {
    public static void main(String[] args) {
        int sum = 4 * 6;

        for (int i = 0; i < 6; i++) {
            sum *= 6 - i;
        }

        System.out.println(sum);
    }
}

【题目44】哥德巴赫猜想:证明一个大于2的偶数总能表示为两个素数之和。

package leif;

public class Test {
    public static void main(String[] args) {
        for (int n = 2; n <= 100; n += 2) {
            for (int i = 2; i <= n - 2; i++) {
                if (function(i)) {
                    if (function(n - i)) {
                        System.out.println(n + " = " + i + " + " + (n - i));
                    }
                }
            }
        }
    }

    public static boolean function(int n) {
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                return false;
            }
        }

        return true;
    }
}

【题目45】判断一个素数能把几个9整除, 如999999 % 7 = 0

package leif;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        label: for (int i : function()) {
            StringBuilder stringBuilder = new StringBuilder("9");

            while (true) {
                long l = 0L;

                try {
                    l = Long.valueOf(stringBuilder.toString());
                } catch (NumberFormatException e) {
                    System.out.println(i + " NumberFormatException");
                    continue label;
                }

                if (l % i == 0) {
                    System.out.println(stringBuilder + " % " + i + " = 0");
                    continue label;
                }

                stringBuilder.append(9);
            }
        }
    }

    public static List<Integer> function() {
        List<Integer> iList = new ArrayList<Integer>();

        label: for (int i = 2; i <= 100; i++) {
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    continue label;
                }
            }

            iList.add(i);
        }

        System.out.println(iList);
        return iList;
    }
}

【题目46】两个字符串连接。

package leif;

public class Test {
    public static void main(String[] args) {
        String s1 = "1";
        long time = System.currentTimeMillis();

        for (int i = 0; i < 50000; i++) {
            s1 = s1 + "1";
        }

        System.out.println("加号所花费的时间:" + (System.currentTimeMillis() - time));
        String s2 = "2";
        time = System.currentTimeMillis();

        for (int i = 0; i < 50000; i++) {
            s2.concat("2");
        }

        System.out.println("cancat方法所花费的时间:" + (System.currentTimeMillis() - time));
        StringBuilder stringBuilder = new StringBuilder("3");
        time = System.currentTimeMillis();

        for (int i = 0; i < 50000; i++) {
            stringBuilder.append("3");
        }

        System.out.println("append方法所花费的时间:" + (System.currentTimeMillis() - time));
    }
}

【题目47】读取7个数(1~50)的整数值,每读取一个值,程序打印出该值个数的*

package leif;

public class Test {
    public static void main(String[] args) {
        for (int i = 1; i <= 7; i++) {
            int random = (int) (Math.random() * 50 + 1);
            System.out.println(random);

            for (int r = 1; r <= random; r++) {
                System.out.print("*");
            }

            System.out.println();
        }
    }
}

【题目48】某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

package leif;

public class Test {
    public static void main(String[] args) {
        int i = (int) (Math.random() * 9000 + 1000);
        System.out.println(i);
        int a = i / 1000;
        int b = i / 100 % 10;
        int c = i / 10 % 10;
        int d = i % 10;
        System.out.println("" + (d + 5) % 10 + (c + 5) % 10 + (b + 5) % 10 + (a + 5) % 10);
    }
}

【题目49】计算字符串中子串出现的次数。

package leif;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s1 = scanner.nextLine();
        System.out.println("请输入要查找的子字符串:");
        String s2 = scanner.nextLine();
        Pattern pattern = Pattern.compile(s2, Pattern.CANON_EQ);
        Matcher matcher = pattern.matcher(s1);
        int counter = 0;

        while (matcher.find()) {
            counter++;
        }

        System.out.println(s2 + "在" + s1 + "出现的次数为:" + counter);
        scanner.close();
    }
}

【题目50】有2个学生,每个学生有3门课的成绩,从磁盘文件中分别读入每个学生的学号、姓名和三门课成绩,计算出每个学生的总成绩,把原有的数据和计算出的数据输出到磁盘文件中。

<?xml version="1.0" encoding="utf-8"?>
<students>
  <student id="1">
    <name>小明</name>
    <subjects>
      <subject>
        <name>Java</name>
        <score>100</score>
      </subject>
      <subject>
        <name>Oracle</name>
        <score>80</score>
      </subject>
      <subject>
        <name>HTML</name>
        <score>90</score>
      </subject>
    </subjects>
    <totalScore>270</totalScore>
  </student>
  <student id="2">
    <name>小红</name>
    <subjects>
      <subject>
        <name>Java</name>
        <score>80</score>
      </subject>
      <subject>
        <name>Oracle</name>
        <score>70</score>
      </subject>
      <subject>
        <name>HTML</name>
        <score>100</score>
      </subject>
    </subjects>
    <totalScore>250</totalScore>
  </student>
</students>
package leif;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Test {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<Student>();
        File file = new File("C:\\Users\\Administrator\\Desktop\\test50.xml");
        SAXReader saxReader = new SAXReader();
        saxReader.setEncoding("UTF-8");

        try {
            Document document = saxReader.read(file);
            parserXML(document, studentList);
            System.out.println(studentList);
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("UTF-8");
        XMLWriter xmlWriter = null;

        try {
            FileWriter fileWriter = new FileWriter("C:\\Users\\Administrator\\Desktop\\newTest50.xml");
            xmlWriter = new XMLWriter(fileWriter, outputFormat);
            Document document = DocumentHelper.createDocument();
            createXML(document, studentList);
            xmlWriter.write(document);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (xmlWriter != null) {
                try {
                    xmlWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void parserXML(Document document, List<Student> studentList) {
        Element studentsElement = document.getRootElement();
        List<Element> studentElementList = studentsElement.elements("student");

        if (studentElementList != null) {
            for (Element studentElement : studentElementList) {
                Student student = new Student();
                Attribute idAttribute = studentElement.attribute("id");

                if (idAttribute != null) {
                    student.setId(Integer.valueOf(idAttribute.getText()));
                }

                Element nameElement = studentElement.element("name");

                if (nameElement != null) {
                    student.setName(nameElement.getText());
                }

                double totalScore = 0;
                Element subjectsElement = studentElement.element("subjects");

                if (subjectsElement != null) {
                    List<Element> subjectElementList = subjectsElement.elements("subject");

                    if (subjectElementList != null) {
                        for (Element subjectElement : subjectElementList) {
                            Subject subject = new Subject();
                            Attribute nameAttribute = subjectElement.attribute("name");

                            if (nameAttribute != null) {
                                subject.setName(nameAttribute.getText());
                            }

                            Element scoreElement = subjectElement.element("score");

                            if (scoreElement != null) {
                                double score = Double.valueOf(scoreElement.getText());
                                subject.setScore(score);
                                totalScore += score;
                            }

                            student.addToSubjectList(subject);
                        }
                    }
                }

                student.setTotalScore(totalScore);
                studentList.add(student);
            }
        }
    }

    public static void createXML(Document document, List<Student> studentList) {
        Element studentsElement = document.addElement("students");

        for (Student student : studentList) {
            Element studentElement = studentsElement.addElement("student");
            studentElement.addAttribute("id", String.valueOf(student.getId()));
            studentElement.addElement("name").setText(student.getName());
            Element subjectsElement = studentElement.addElement("subjects");

            for (Subject subject : student.getSubjectList()) {
                Element subjectElement = subjectsElement.addElement("subject");
                subjectElement.addAttribute("name", subject.getName());
                subjectElement.addElement("score").setText(String.valueOf(subject.getScore()));
            }

            studentElement.addElement("totalScore").setText(String.valueOf(student.getTotalScore()));
        }
    }
}

class Student {
    private int id;
    private String name;
    private List<Subject> subjectList = new ArrayList<Subject>();
    private double totalScore;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Subject> getSubjectList() {
        return subjectList;
    }

    public void addToSubjectList(Subject subject) {
        subjectList.add(subject);
    }

    public double getTotalScore() {
        return totalScore;
    }

    public void setTotalScore(double totalScore) {
        this.totalScore = totalScore;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", subjectList=" + subjectList + ", totalScore=" + totalScore + "]";
    }
}

class Subject {
    private String name;
    private double score;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Subject [name=" + name + ", score=" + score + "]";
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,310评论 0 9
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,283评论 0 19
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,129评论 0 41
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,852评论 0 2
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一...
    CoderBigBear阅读 11,450评论 3 7