17-JavaSE基础巩固练习:Math类API两道数学算法水题

news2024/12/27 13:31:53

两道算法水题(一)

一、判断质数

  • 判断一个数是否为一个质数。

1、以前的写法

package com.app.demo26_math_api;

public class Test1 {
    public static void main(String[] args) {
        /*
            判断n(任意整数)是否为一个质数:
                以前的写法:
                    是用n对2~n之间的每一个数进行求余,
                    如果为0就不是质数,否则就为质数。
         */
        System.out.println(isPrime(997));
    }

    /**
     * 判断n是否为一个质数
     * @param n 任意整数
     * @return  是则返回true,否则返回false
     */
    private static boolean isPrime(int n) {
        int count = 0;
        for (int i = 2; i < n; i++) {
            count++;    // 每循环1次,计数
            if (n % i == 0) {
                return false;
            }
        }
        System.out.println("循环了:" + count + "次");
        return true;
    }
}
循环了:995次
true

Process finished with exit code 0

  • 可以看到,以前的写法,需要循环2~n之间的每一个数,效率非常的低!


2、优化写法

(1)思考
  • 从下面的数之中,可以看到什么规律吗?

    在这里插入图片描述

  • 拿16举个例子:

    在这里插入图片描述

    • 16的平方根是4,那么4.1和4.1相乘是不是就不可能等于16?
    • 那么3.9和3.9相乘是不是就不可能等于16?
    • 回答:是的,因此总结出规律,一个整数的任意一对因子中,左边都是小于等于平方根的,右边都是大于等于平方根的。


(2)结论
  • 一个整数的任意一对因子中,左边都是小于等于平方根的,右边都是大于等于平方根的

  • 由于一个任意整数的因子都是成双成对出现的,因此我们只需要判断平方根左边的数就可以了!

  • 就不需要循环得到2到任意整数之间的每个数来判断了!

  • 注意:必须包含平方根本身,因为因子是一对一对出现的,而平方根就是中间点!

在这里插入图片描述



(3)实现
package com.app.demo26_math_api;

public class Test1Plus {
    public static void main(String[] args) {
        /*
            判断n(任意正整数)是否为一个质数:
                优化写法:
                    是用n对2~n的平方根之间的每一个数(包含平方根本身)进行求余,
                    如果为0就不是质数,否则就为质数。
         */
        System.out.println("997是质数:" + isPrime(997));
    }

    /**
     * 判断n是否为一个质数
     *
     * @param n 任意正整数
     * @return 是则返回true,否则返回false
     */
    private static boolean isPrime(int n) {
        int count = 0;
        // Math类的sqrt(): 返回值的正确舍入正平方根
        for (int i = 2; i <= Math.sqrt(n); i++) {
            count++;    // 每循环1次,计数
            if (n % i == 0) {
                return false;
            }
        }
        System.out.println("循环了:" + count + "次");
        return true;
    }
}
循环了:30次
997是质数:true

Process finished with exit code 0

  • 可以看到,只循环了30次,大大提高了效率!


两道算法水题(二)

1、思考

  • 自幂数,一个n位自然数等于自身各个数位上数字的n次幂之和。
  • 举例1:三位数
    • 1^3 + 5^3 + 3^3 = 153
  • 举例2:四位数
    • 1^4 + 6^4 + 3^4 + 4^4=1634

  • 如果自幂数是一位数,也叫做:独身数
  • 三位自幂数:水仙花数
  • 四位自幂数:四叶玫瑰数
  • 五位自幂数:五角星数
  • 六位自幂数:六合数
  • 七位自幂数:北斗七星数
  • 八位自幂数:八仙数
  • 九位自幂数:九九重阳数
  • 十位自幂数:十全十美数


2、需求

  • 1、统计一共有多少个水仙花数。
  • 2、证明没有两位的自幂数。
  • 3、分别统计有多少个四叶玫瑰数和五角星数。(答案是3个)


3、实现

(1)以前的写法
package com.app.demo26_math_api;

public class Test2 {
    public static void main(String[] args) {
        /*
            1、统计一共有多少个水仙花数。
            2、证明没有两位的自幂数。
            3、分别统计有多少个四叶玫瑰数和五角星数。(答案都是3个)
         */
        narcissisticNumber();   // 水仙花数
        System.out.println("两位的自幂数存在吗:" + noTwoSelfPowerNumber() + "\n"); // 证明两位的自幂数是不存在的
        fourLeafNumber();       // 四叶玫瑰数
        fivePointedNumber();    // 五角星数
    }

    /**
     * 统计五角星数
     */
    private static void fivePointedNumber() {
        int count = 0;
        for (int i = 10000; i < 99999; i++) {
            // 依次得到当前数的个位、十位、百位、千位、万位数
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            int qian = i / 1000 % 10;
            int wan = i / 10000 % 10;

            // 统计每一位的五次方之和
            int sum = ge*ge*ge*ge*ge + shi*shi*shi*shi*shi + bai*bai*bai*bai*bai + qian*qian*qian*qian*qian + wan*wan*wan*wan*wan;
            // 判断当前数的五次方之和 是否与本身 相等
            if (sum == i) {
                // 是,则说明当前数是四叶玫瑰数,统计个数并输出
                count++;
                System.out.println(i);
            }
        }
        System.out.println("五角星数有" + count + "个。\n");
    }

    /**
     * 统计四叶玫瑰数
     */
    private static void fourLeafNumber() {
        int count = 0;
        for (int i = 1000; i < 9999; i++) {
            // 依次得到当前数的个位、十位、百位、千位数
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            int qian = i / 1000 % 10;

            // 统计每一位的四次方之和
            int sum = ge*ge*ge*ge + shi*shi*shi*shi + bai*bai*bai*bai + qian*qian*qian*qian;
            // 判断当前数的四次方之和 是否与本身 相等
            if (sum == i) {
                // 是,则说明当前数是四叶玫瑰数,统计个数并输出
                count++;
                System.out.println(i);
            }
        }
        System.out.println("四叶玫瑰数有" + count + "个。\n");
    }

    /**
     * 判断是否有两位的自幂数
     * @return 有则返回true,否则返回false
     */
    private static boolean noTwoSelfPowerNumber() {
        for (int i = 10; i <= 99; i++) {
            // 依次得到该数的个位、十位数
            int ge = i % 10;
            int shi = i / 10 % 10;

            // 每一位的二次方之和
            int sum = ge*ge + shi*shi;
            // 判断每一位的二次方之和 是否等于当前数
            if (sum == i) {
                // 是,则说明两位的自幂数存在,输出并返回true
                System.out.println(i);
                return true;
            }
        }
        // 循环结束,说明两位的自幂数不存在,返回false
        return false;
    }

    /**
     * 统计水仙花数的个数
     */
    private static void narcissisticNumber() {
        // 定义计数器
        int count = 0;

        for (int i = 100; i <= 999; i++) {
            // 依次得到该数的个位、十位、百位数
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            // 以前的写法:
            // 每一位的三次方之和 跟本身 进行比较
            int sum = ge*ge*ge + shi*shi*shi + bai*bai*bai;
            // 判断是否相等
            if (sum == i) {
                // 是,则说明该数是水仙花数,统计个数并且输出
                count++;
                System.out.println(i);
            }
        }

        System.out.println("水仙花数有" + count + "个。\n");
    }
}
153
370
371
407
水仙花数有4个。

两位的自幂数存在吗:false

1634
8208
9474
四叶玫瑰数有3个。

54748
92727
93084
五角星数有3个。


Process finished with exit code 0

  • 可以看到,虽然实现出来了,但是代码还是不太优雅!

  • 比如:

    ge*ge*ge*ge*ge + shi*shi...
    
    • 这样的代码非常冗长!

(2)优化写法
package com.app.demo26_math_api;

public class Test2Plus {
    public static void main(String[] args) {
        /*
            1、统计一共有多少个水仙花数。
            2、证明没有两位的自幂数。
            3、分别统计有多少个四叶玫瑰数和五角星数。(答案都是3个)
         */
        narcissisticNumber();   // 水仙花数
        System.out.println("两位的自幂数存在吗:" + noTwoSelfPowerNumber() + "\n"); // 证明两位的自幂数是不存在的
        fourLeafNumber();       // 四叶玫瑰数
        fivePointedNumber();    // 五角星数
    }

    /**
     * 统计五角星数
     */
    private static void fivePointedNumber() {
        int count = 0;
        for (int i = 10000; i < 99999; i++) {
            // 依次得到当前数的个位、十位、百位、千位、万位数
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            int qian = i / 1000 % 10;
            int wan = i / 10000 % 10;

            // 统计每一位的五次方之和
            /*
                Math类的pow(double a, double b):
                    API作用:返回a的值的b次幂
                    double a(参数一):值本身
                    double b(参数二):多少次幂
             */
            double sum = Math.pow(ge, 5) + Math.pow(shi, 5) + Math.pow(bai, 5) + Math.pow(qian, 5) + Math.pow(wan, 5);
            // 判断当前数的五次方之和 是否与本身 相等
            if (sum == i) {
                // 是,则说明当前数是四叶玫瑰数,统计个数并输出
                count++;
                System.out.println(i);
            }
        }
        System.out.println("五角星数有" + count + "个。\n");
    }

    /**
     * 统计四叶玫瑰数
     */
    private static void fourLeafNumber() {
        int count = 0;
        for (int i = 1000; i < 9999; i++) {
            // 依次得到当前数的个位、十位、百位、千位数
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            int qian = i / 1000 % 10;

            // 统计每一位的四次方之和
            /*
                Math类的pow(double a, double b):
                    API作用:返回a的值的b次幂
                    double a(参数一):值本身
                    double b(参数二):多少次幂
             */
            double sum = Math.pow(ge, 4) + Math.pow(shi, 4) + Math.pow(bai, 4) + Math.pow(qian, 4);
            // 判断当前数的四次方之和 是否与本身 相等
            if (sum == i) {
                // 是,则说明当前数是四叶玫瑰数,统计个数并输出
                count++;
                System.out.println(i);
            }
        }
        System.out.println("四叶玫瑰数有" + count + "个。\n");
    }

    /**
     * 判断是否有两位的自幂数
     * @return 有则返回true,否则返回false
     */
    private static boolean noTwoSelfPowerNumber() {
        for (int i = 10; i <= 99; i++) {
            // 依次得到该数的个位、十位数
            int ge = i % 10;
            int shi = i / 10 % 10;

            // 每一位的二次方之和
            /*
                Math类的pow(double a, double b):
                    API作用:返回a的值的b次幂
                    double a(参数一):值本身
                    double b(参数二):多少次幂
             */
            double sum = Math.pow(ge, 2) + Math.pow(shi, 2);
            // 判断每一位的二次方之和 是否等于当前数
            if (sum == i) {
                // 是,则说明两位的自幂数存在,输出并返回true
                System.out.println(i);
                return true;
            }
        }
        // 循环结束,说明两位的自幂数不存在,返回false
        return false;
    }

    /**
     * 统计水仙花数的个数
     */
    private static void narcissisticNumber() {
        // 定义计数器
        int count = 0;

        for (int i = 100; i <= 999; i++) {
            // 依次得到该数的个位、十位、百位数
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            // 优化写法:
            // 每一位的三次方之和 跟本身 进行比较
            /*
                Math类的pow(double a, double b):
                    API作用:返回a的值的b次幂
                    double a(参数一):值本身
                    double b(参数二):多少次幂
             */
            double sum = Math.pow(ge, 3) + Math.pow(shi, 3) + Math.pow(bai, 3);
            // 判断是否相等
            if (sum == i) {
                // 是,则说明该数是水仙花数,统计个数并且输出
                count++;
                System.out.println(i);
            }
        }

        System.out.println("水仙花数有" + count + "个。\n");
    }
}
153
370
371
407
水仙花数有4个。

两位的自幂数存在吗:false

1634
8208
9474
四叶玫瑰数有3个。

54748
92727
93084
五角星数有3个。


Process finished with exit code 0

  • 代码优化了,实现结果也一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb Filter 过滤器

参考&#xff1a;JavaWeb过滤器(Filter)详解 1、简介 顾名思义就是对事物进行过滤的&#xff0c;在Web中的过滤器&#xff0c;当然就是对请求进行过滤&#xff0c;我们使用过滤器&#xff0c;就可以对请求进行拦截&#xff0c;然后做相应的处理&#xff0c;实现许多特殊功能。…

阿里云部署应用

安装jdk 查看已安装版本 rpm -qa | grep java yum命令查找JDK1.8软件包 yum -y list java-1.8* 安装列表中的JDK1.8软件包 yum -y install java-1.8.0-openjdk-devel.x86_64 java -version 配置环境变量 vim /etc/profile JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.…

三、内存管理 (二)虚拟存储器

目录 2.1虚拟内存的基本概念 2.2内存分配策略 2.2.1驻留集大小 2.2.2固定分配局部置换 2.2.3可变分配全局置换 2.2.4可变分配局部置换 2.3地址变换机构 2.3.1页表机制 2.3.2预调页策略和请求调页策略 2.3.3缺页中断机构 2.3.4对换区与文件区 2.3.5页面置换算法 …

搭建springWeb保姆级教程

经过我们对mybatis和spring框架的学习&#xff0c;我们即将要用框架进行前后端数据交互&#xff0c;已经脱离了那种用servlet的方式进行数据传输&#xff0c;今天让我们来搭建最基本的springweb框架&#xff01;&#xff01;&#xff01; 1.创建一个web项目 1. 2. 选择一个we…

自定义线程实现c++代码回调run方法

目录 pthread_create函数介绍 前面写过一篇文章《Thread类的start()方法创建线程的底层分析》&#xff0c;这次来自定义一个线程&#xff0c;并实现在底层创建内核线程来执行用户代码。 pthread_create函数介绍 在这之前&#xff0c;先熟悉下Linux中创建内核线程函数pthread…

【计算机视觉】 摄像机标定

摄像机标定 齐次坐标 齐次坐标&#xff0c;将欧氏空间的无穷远点&#xff0c;与投影空间中有实际意义的消失点&#xff0c;建立起映射关系。 把齐次坐标转化为笛卡尔坐标的方法&#xff1a;是前面n-1个坐标分量分别除以最后一个分量即可 一些解释和性质&#xff1a; 比较好的…

Linux最常用命令用法总结(精选)

1. su 普通用户切换root用户 ubuntuubuntu20:~$ su Password: rootubuntu20:/home/ubuntu# exit exit ubuntuubuntu20:~$ 2. clear 清除当前终端显示的输出快捷键ctrlL键 3. cd 改变目录 ubuntuubuntu20:~/workspace$ cd .. ubuntuubuntu20:~$ cd / ubuntuubuntu20:/$ c…

docker下搭建redis集群

1. 环境准备 准备好Linux系统机器&#xff0c;并安装好docker&#xff0c;阅读这篇文章前请先了解清楚docker的基本知识并且会熟悉运用docker的常用命令。学习docker基础知识可以参考这篇博文 安装好并启动docker后就可以开始搭建redis了 2. docker容器下安装redis 本篇文章…

数据链路层(必备知识)

文章目录1、数据链路层的作用2、认识以太网<1>以太网帧格式<2>认识MAC地址<3>认识MTU<4>查看硬件地址和MTU3、ARP协议<1>什么是ARP协议<2>ARP数据报格式<3>ARP协议的工作机制4、其他重要协议或技术<1> DNS<2>NAT技术1、…

《MySQL实战45讲》——学习笔记19 “SQL查一行执行慢的排查、锁等待/一致性读“【建议收藏】

由于SQL本身的写法问题&#xff08;如join太多表、未走索引/索引失效、一次查太多数据等&#xff09;&#xff0c;或是MySQL节点CPU占用率很高或IO利用率很高&#xff0c;都会导致一条SQL执行的比较慢&#xff1b;但是有时候&#xff0c;"只查一行数据"&#xff0c;也…

内存优化之重新认识内存

我们知道&#xff0c;手机的内存是有限的&#xff0c;如果应用内存占用过大&#xff0c;轻则引起卡顿&#xff0c;重则导致应用崩溃或被系统强制杀掉&#xff0c;更严重的情况下会影响应用的留存率。因此&#xff0c;内存优化是性能优化中非常重要的一部分。但是&#xff0c;很…

深入体会线程状态的切换

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE初阶】 &#x1f432;&#x1f432;本篇内容&#xff1a;线程状态详解 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&am…

微机-------CPU与外设之间的数据传送方式

目录 一、无条件方式二、查询方式三、中断方式四、DMA方式一、无条件方式 外设要求:简单、数据变化缓慢。 外设被认为始终处于就绪状态。始终准备好数据或者始终准备好接收数据。 IN AL,数据端口 数据端口的地址通过CPU的地址总线送到地址译码器进行译码,同时该指令进行的是…

JAVASE(复习)——异常

所有的异常都是在java.lang包中的Throwable类中 一、Exception 和 Error 的区别 exception&#xff1a;程序本身发生的异常&#xff0c;可以捕获抛出异常&#xff0c;一般用try—catch—finally捕获。 error&#xff1a;发生在jvm层面的错误&#xff0c;程序无法处理。 二…

Git 如何调整 commit 的顺序

title: Git 如何调整 commit 的顺序 date: 2022-12-02 23:11 tags: [git] 〇、问题 使用哪条命令调整commit的顺序&#xff1f; git rebase -i 一、前言 今天测试了git hooks&#xff0c;产生了大量的commit&#xff0c;而后又进行了正常的commit&#xff0c;因此在这里是想要…

java——mybatis——Mybatis注解开发——@Update——修改数据

DAO接口&#xff1a; package com.sunxl.dao;import com.sunxl.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.SelectKey; import org.apache.ibatis.annotations.Update;impo…

SpringBoot+Thymeleaf上传头像并回显【表单提交】

参考文章&#xff1a;springbootthymeleaf实现图片上传并回显https://www.wanmait.com/note/shaowei/javaee/b3717a24fde24d3e89c47765a1a63214.html 一、新建SpringBoot项目 添加 spring web和 thymeleaf 的依赖 二、在templates新建页面 在页面中添加一个表单和一个文件上传…

8086,8088CPU管脚,奇偶地址体, ready信号,reset复位信号。规则字和非规则字

8086/8088均为40条引线&#xff0c;双列直插式封装&#xff0c;某些引线有多重功能&#xff0c;其功能转换有两种情况&#xff1a;一种是分时复用&#xff0c;一种是按组态定义。 用8088微处理器构成系统时&#xff0c;有两种不同的组态&#xff1a; 最小组态&#xff1a;808…

@AutoWired与@Resource

参考 : Qualifier - 搜索结果 - 知乎 Autowired和Resource的区别是什么&#xff1f; - 知乎 面试突击78&#xff1a;Autowired 和 Resource 有什么区别&#xff1f; - 掘金 目录 同一类型多个Bean报错问题 Resource注解 Resource的查找顺序 Resource注解实现依赖注入 Reso…

网课题库接口调用方法

网课题库接口调用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…