Java经典算法题【1-10】【含个人理解】

1.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入月数:");
        int i = sc.nextInt();

        int total = 0; //兔子总量
        int before_demo1 = 1;//第一月数量
        int before_demo2 = 1;//第二月数量
        int before_demo = before_demo1 + before_demo2;//上月数量
        int now_demo = 0;

        if (i == 1 || i == 2){
            System.out.println("兔子数量只有" + before_demo1 + "对");
        }else if (i == 3){
            System.out.println("兔子数量" + before_demo + "对");
        }else {
            for (int j = 0; j < i - 3; j++) {
                now_demo = before_demo + before_demo2;
                before_demo2 = before_demo; //上月赋给前月
                before_demo = now_demo;//现月赋给上月
                System.out.println("now:" + now_demo);
            }
            System.out.println("兔子数量" + now_demo + "对");
        }

    }

个人理解:排除不好循环的前几个月单独定义,之后依次将每月的数量赋值下移,上月赋给前月,现月赋给上月,完成位序下移后,相加即为本月结果【本月兔子数量 = 上月兔子数量 + 前月兔子数量】 

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

前提补充:判断一个数是否为素数

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入判断数:");
        int i = sc.nextInt();
        double j = Math.sqrt(i);
        double u = Math.ceil(j); //向上取整
        int c = Double.valueOf(u).intValue();//转化为int类型

        for (int k = 2; k < c + 1; k++) {
            if (i % k == 0){
                System.out.println("该数不是素数");
                return;
            }
        }
        System.out.println("该数是素数");

    }

判断条件:循环从2到根号X,一个数的两个因数中,毕然有一个小于等于根号X

常规判断:循环从2到X本身

个人补充:当循环条件判断到该数不是素数时,直接中断整个程序,否则输出该数是素数

    public static void main(String[] args) {
        int count = 0;

        for (int i = 101; i < 201; i++) {
            double j = Math.sqrt(i);
            double u = Math.ceil(j); //向上取整
            int c = Double.valueOf(u).intValue();//转化为int类型
            int count_demo = 0;

            for (int k = 2; k < c + 1; k++) {
                if (i % k == 0){
                    count_demo++;
                    count++;
                    break;
                }
            }

            if (count_demo == 0){
                System.out.println(i);//输出素数
            }

        }

        int y = 200 - 101 + 1 - count;
        System.out.println("素数数量为:" + y);
        System.out.println("不是素数数量为:" + count);

    }

个人理解:素数的输出不好判断,则输出非素数的输出,最后用总数减去非素数数量,则得出素数数量;用一个值来判断是否运行了非素数判断,运行了不为0,反之则为0,为0,则输出当前数

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

前提补充:取得输入数字,各个位数上的数字

int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
int qian = i / 1000 % 10;

通用取得位数数字公式

Math.pow(a, b)//计算a的b次方
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("输出判断数:");
        int i = sc.nextInt();

        int ge = i % 10;
        int shi = i / 10 % 10;
        int bai = i / 100 ;
        
        int j = (int) (Math.pow(bai,3) + Math.pow(shi,3) + Math.pow(ge,3));
        
        if (j == i){
            System.out.println("该数为水仙花数");
        }else {
            System.out.println("该数不是水仙花数");
        }

    }

个人理解:根据取出各个位数上数字的公式,取出数值后,后续就方便计算了

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

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> list_demo = new ArrayList<>();
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入判断数:");
        int i = sc.nextInt();
        int y = i;
        double j = Math.sqrt(i);
        double u = Math.ceil(j); //向上取整
        int c = Double.valueOf(u).intValue();//转化为int类型

        //获取整除数组
        for (int k = 2; k < c + 1; k++) {
            if (i % k == 0) {
                list.add(k);
            }
        }
        System.out.println(list);

        //循环判断整除
        for (int k = 0; k < list.size(); k++) {
            while (i % list.get(k) == 0) {
                list_demo.add(list.get(k));
                i = i / list.get(k);
            }
        }
        System.out.println(list_demo);

        //输出
        String s = y + "=";
        for (int k = 0; k < list_demo.size(); k++) {
            if (k == 0){
                s = s + "" + list_demo.get(k);
            }else {
                s = s + "*" + list_demo.get(k);
            }
        }
        System.out.println(s);

    }

个人理解:先判断,输入的数能被哪些数整除,并存入数组;将输入数,循环重复被整除数组第一个数整除,直到这个数不能被第一个数整除后,开始被下一个数整除,每整除一次,添加一次进入下个数组,循环输出下个数组即为因数

5.题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入成绩:");
        int i = sc.nextInt();
        char str = i >= 90 ? 'A' :
                   i >= 60 ? 'B' : 'c';
        System.out.println(str);
    }

个人理解:嵌套条件不清楚的时候,分开写就行

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

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> list_demo = new ArrayList<>();
        ArrayList<Integer> list_add = new ArrayList<>();
        ArrayList<Integer> list_demo_add = new ArrayList<>();
        ArrayList<Integer> max = new ArrayList<>();

        Scanner sc = new Scanner(System.in);
        System.out.println("输入第一个正整数:");
        int i = sc.nextInt();
        int i1 = i;
        System.out.println("输入第二个正整数:");
        int j = sc.nextInt();
        int j1 = j;

        for (int k = 2; k < i + 1; k++) {
            if (i % k == 0){
                list.add(k);
            }
        }

        for (int k = 2; k < j + 1; k++) {
            if (j % k == 0){
                list_demo.add(k);
            }
        }
        //最大公约数
        for (int k = 0; k < list.size(); k++) {
            for (int l = 0; l < list_demo.size(); l++) {
                if (list.get(k) == list_demo.get(l)){
                    max.add(list.get(k));
                }
            }
        }
        int u = max.size() - 1;
        System.out.println("最大公约数为:" + max.get(u));

        //分解因式
        //循环判断整除
        for (int k = 0; k < list.size(); k++) {
            while (i % list.get(k) == 0) {
                list_add.add(list.get(k));
                i = i / list.get(k);
            }
        }
        System.out.println(list_add);

        for (int k = 0; k < list_demo.size(); k++) {
            while (j % list_demo.get(k) == 0) {
                list_demo_add.add(list_demo.get(k));
                j = j / list_demo.get(k);
            }
        }
        System.out.println(list_demo_add);

        //最小公倍数
        int z = (i1 / max.get(u)) * (j1 / max.get(u)) * max.get(u);
        System.out.println("最小公倍数:" + z );
    }

个人理解:最大公约数,找出正整数的各个因数,比较记录存入数组,最后存入数组的即为最大公约数;最小公倍数,输入的正整数,除去最大公约数,再相乘,再乘最大公约即为最小公倍数

7.题目:输入一行字符,分别统计出其英文字母、空格的个数。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        char ch[] = s.toCharArray();

        int count = 0;
        int number = 0;

        for (int i = 0; i < ch.length; i++) {
            if ((ch[i] >= 97 && ch[i] <= 122) || (ch[i] >= 65 && ch[i] <= 90)){
                count++;
            }else if (ch[i] == 32){
                number++;
            }
        }

        System.out.println("字母数量为:" + count);
        System.out.println("空格数量为:" + number);
        
    }

个人理解:输入为nextLine,可以录入空格,将输入的字符串转为数组,数组字符的比较是Ascall码,对比相同的Ascall码,或者范围内的Ascall码,即可确定输入的内容是什么

8.题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入计算数字:");
        int i = sc.nextInt();
        System.out.println("输入计算位数:");
        int j = sc.nextInt();

        int total = 0;
        int temp = 0;
        int add = 0;
        String add_demo = "s";

        for (int k = 0; k < j; k++) {
            temp = (int) (i * Math.pow(10,k));
            total = temp + total;
            add = add + total;
            if (k == 0){
                add_demo = add_demo + "=" + total;
            }else {
                add_demo = add_demo + "+" + total;
            }
        }
        System.out.println("总数为:" + add);
        System.out.println(add_demo);
        
    }

个人理解:记录清楚每次需要叠加的值,再用空白字符串,相加转为字符串叠加即可

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

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        int temp = 0;
        
        for (int i = 1; i < 1001; i++) {

            list.removeAll(list);
            temp = 0;

            for (int j = 1; j < i + 1; j++) {
                if (i % j == 0 && j != i) {
                    list.add(j);
                }
            }

            for (int j = 0; j < list.size(); j++) {
                temp = temp + list.get(j);
            }
            
            if (temp == i) {
                System.out.println(i);
                System.out.println(list);
            }

        }
    }

个人理解:用数组记录因子,再遍历数组并相加,就可得出答案

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

    public static void main(String[] args) {
        double down = 0;
        double up = 0;
        double high = 100.0;
        double half_high = 50.0;

        for (int i = 0; i < 10; i++) {
            down = high + down;
            high = high / 2;
        }
        System.out.println(down);

        for (int i = 0; i < 9; i++) {
            up = half_high + up;
            half_high = half_high / 2;
        }
        System.out.println(up);

        double total = down + up;

        System.out.println("总共经过了" + total + "米");
        System.out.println("第十次反弹高度为" + half_high + "米");

    }

个人理解:将落地和升高分开看,分别计算,就可以得出答案

题目引用来自:Java经典算法50题(含代码)_不会敲代码的肥仔的博客-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值