《JavaSE-习题篇一》之小题目,大道理

简介: 《JavaSE-习题篇一》之小题目,大道理

本篇讲解几道java基础题

文章小助手

文章目录

小题目,大道理。

素数求解

什么是素数?

题目一:判断一个数否是素数

法一

法二

法三

自幂数

求1~n范围内的自幂数

统计二进制位中的1的个数

法一

法二

法三

总结

小题目,大道理。

素数求解

什么是素数?

定义: 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。

题目一:判断一个数否是素数

分析:根据素数的定义可知,素数是除了1和自身以外不能被其它整除,所以我们可以通过枚举2到我们判断的数之间的数是否存在可以被我们要判断的数整除,如果有则不是素数,反之则是素数。

法一

import java.util.Scanner;
public class Demo9 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int i = 2;
        for (; i < n; i++) {
        if(n%i==0){
            System.out.println("不是素数");//2~n之间是否有数字能整除n
            break;
        }
        }
        if(i==n){//i==n说明没有,所以必然是素数
            System.out.println("是素数");
        }
    }
}

法一是通过枚举出2~n-1之间所有的数,而实际只需要有一个数能把n整除即可,所以我们可以试图来缩小枚举的范围。我们都知道任意一个数可以写成n=ab,比如16可以写成,16=1 * 16 ,或者16=44,或者16=2 * 8。通过这三个式子,我们可以发现a和b中一定有小于定于2/n,我们可以直接除以2/n,这样就可以将要除的数缩小一半,效率自然也上来。

法二

import java.util.Scanner;
public class Demo10 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int i = 2;
        for (; i <=n/2; i++) {
            if(n%i==0){
                System.out.println("不是素数");
                break;
            }
        }
        if(i>n/2){
            System.out.println("是素数");
        }
    }
}

我们还可以将枚举的范围在缩小一半,因为a和b一定有一个数会小于等于根号16,如此又将范围砍一半,效率杠杆的上来了。

法三

import java.util.Scanner;
public class Demo11 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int i = 2;
        for (; i <=Math.sqrt(n); i++) {
            if(n%i==0){
                System.out.println("不是素数");
                break;
            }
        }
        if(i>Math.sqrt(n)){
            System.out.println("是素数");
        }
    }
}

测试代码的运行时间的方法

long startTime = System.currentTimeMillis();
// 要获取运行时间的代码片
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:" + (double) (endTime - startTime) / 1000 + "s");//单位是秒

感兴趣的朋友可以用以上代码对求素数的三种方法进行测试。

自幂数

定义:如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数。

求1~n范围内的自幂数

分析:首先我们需要判断这个数是几位数,其次需要拿到该数的每一位数,最后进行判断自然数是否等于自身各个数位上数字的n次幂之和。

代码

public class Demo14 {
    public static void main(String[] args) {
        for (int i = 1; i < 999; i++) {
            int tmp = i;
            int count = 0;
            while (tmp != 0) {
                count++;//计算位数
                tmp = tmp / 10;
            }
            tmp=i;
            int sum=0;
            while (tmp != 0) {
                sum += Math.pow(tmp % 10, count);
                tmp = tmp / 10;//得到每一位数
            }
            if (sum == i) {
                System.out.print(i + " ");
            }
        }
    }
}

注意:Math.pow()范围值的类型为douoble,使用+=赋值给sum,会发生强制类型转换,但是数值的损失是可以接受的。(小数点后面的数)

统计二进制位中的1的个数

分析:利用任何一个数按位于1之后结果还是1,基于此结论我们可以将一个数的32个比特位与1按位于之后判断结果是否为1,再将该数右移,在次重复上述的计算.而我们只需定义一个计算器去统计一个数按位于1之后结果还是1的真结果即可。

法一

public class Demo16 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int count=0;
        for(int i=0;i<32;i++){
            if((n&(1<<i))!=0){
                count++;
            }
        }
        System.out.println(count);
    }
}

上述代码对于数字7来说并不友好,因为7的最后4位二进制为0111,按照上述多移了29次,在时间上有所浪费,为了节约时间所以我们可以将n每移一位数后重新赋值即n=n>>1,循环条件为n不等于0.

法二

public class Demo17 {
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int n=sc.nextInt();
        int count=0;
        while (n!=0){
            if((n&1)!=0){
                count++;
            }
            n=n>>>1;
        }
        System.out.println(count);
    }
}

注意:如果该数为负数并且是简单的右移,会造成死循环,因为负数右移后补符号位即1,所以为了解决这个问题我们使用无符号右移。

法三

巧用n=n&(n-1)

化抽象为具体一图解疑惑

由图可以,可以发现7的二进制序列每次按位与之后都少了1,我们只需每次按位与之后用计算器统计即可。

代码

public class Demo18 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        while (n!=0) {
            n=n&(n-1);
            count++;
        }
        System.out.println(count);
    }
}
总结

题目虽然不难,但是想出最优解才是最难的,每一题目都不容忽视,都值得深思就像做数学题要做到一题多解,要做到更快,用更的办法解出,相信秉持钉子精神,咋们迟早刷爆力扣,hhhh!

最后的话

各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!

相关文章
|
数据采集 人工智能 供应链
年末复盘全域数据太糟心?瓴羊One一站搞定!
年末复盘全域数据太糟心?瓴羊One一站搞定!
382 0
年末复盘全域数据太糟心?瓴羊One一站搞定!
|
5月前
|
人工智能 自然语言处理 安全
2026年阿里云OpenClaw(Clawdbot)一键部署+企业微信快速接入喂饭级教程
OpenClaw(原Clawdbot/Moltbot)作为阿里云生态下的开源AI自动化代理工具,凭借自然语言交互、企业级任务自动化、多平台无缝集成的核心能力,已成为企业轻量化数字化转型的关键抓手。2026年阿里云推出OpenClaw专属一键部署方案,结合企业微信在办公场景的高渗透率,实现“办公软件内下达指令,AI自动执行任务”的高效协作模式。本文将完整拆解阿里云环境下OpenClaw的一键部署流程,重点详解企业微信机器人创建、加密配置、对接调试的全步骤,包含实操代码命令与企业级避坑技巧,技术零基础的企业用户也能快速完成从部署到落地的全流程。
1486 8
|
4月前
|
人工智能 API 开发工具
阿里云百炼Coding Plan开箱指南:费用价格、用量额度及免费Tokens领取
阿里云百炼Coding Plan是专为AI编程打造的订阅服务,现仅提供Pro版(200元/月),含每月9万次请求额度,支持Qwen3.5-plus、Kimi、GLM-5等多模型。开通百炼可免费领7000万Tokens,需使用专属API Key(sk-sp-开头)及Base URL。
|
消息中间件 运维 监控
小麦助教:通过阿里云原生中间件产品组合,加速微服务架构落地
通过深度的使用阿里云丰富的云原生中间件产品,助力小麦微服务架构的快速落地,借助可观测、消息等产品,极大地提升了开发和运维效率,使小麦在降本增效上有了新的突破,真正做到了只关注业务本身。
5131 97
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
460 19
|
编解码 Python
python--海温、OLR数据分布做显著性检验,绘制空间分布并打点
使用python对海洋气象数据做显著性检验,并绘制空间pattern
python--海温、OLR数据分布做显著性检验,绘制空间分布并打点
|
编解码 搜索推荐 数据库
营销型网站建设怎么做好?做好营销型网站的方法
营销型网站建设较传统网站建设有较大的差别,很多没有做过的企业对营销型网站建设并不了解,那营销型网站建设该怎么做呢?做好营销型网站的方法又有哪些?接下来小编将进行逐一分解,帮助您建好营销型网站,一起来看看吧。
525 0
营销型网站建设怎么做好?做好营销型网站的方法
|
存储 小程序 编译器
数据的存储(上)
数据的存储(上)
195 0
|
Ubuntu Linux iOS开发
Mac mini M1 上成功启动 Ubuntu
从上周末起,Corellium 就开始发布他们在 Apple M1 上的 Linux 启动工作。现在,他们已经可以在 Mac mini M1 通过 USB 启动完整的 Ubuntu桌面。并且,Corellium 开发人员已经在 Linux 邮件列表中发表了该系列的 7 个补丁,这些是使 Linux 在当前的基于 Apple M1 ARM 的硬件上启动所需的最小更改。该系列补丁内容如下:
Mac mini M1 上成功启动 Ubuntu
|
机器学习/深度学习
【读书笔记】Algorithms for Decision Making(7)
策略搜索即搜索策略空间,而无需直接计算值函数。策略空间的维数通常低于状态空间,并且通常可以更有效地搜索。本部分首先讨论在初始状态分布下估计策略价值的方法。然后讨论不使用策略梯度估计的搜索方法和策略梯度方法。接着介绍Actor-Critic方法用值函数的估计来指导优化。
303 0

热门文章

最新文章