Java自幂数计算及其算法改进

news/2024/7/8 2:47:49 标签: 算法, java, c++

文章目录

  • 1. 自幂数
  • 2.自幂数的个数
  • 3. 常规自幂数计算方法
  • 4.算法代码改进

1. 自幂数

如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数。
例如:在十进制中,153是一个三位数,各个数位的3次幂之和为13+53+3^3=153,所以153是十进制中的自幂数。
在n进制中,所有小于n的正整数都为自幂数,比如2进制中1是自幂数,3进制中1和2都是自幂数,4进制中1,2和3都是自幂数…

2.自幂数的个数

独身数共有9个: 1,2,3,4,5,6,7,8,9;
水仙花数共有4个:153,370,371,407;
四叶玫瑰数共有3个:1634,8208,9474;
五角星数共有3个:54748,92727,93084;
六合数只有1个:548834;
北斗七星数共有4个:1741725,4210818,9800817,9926315;
八仙数共有3个:24678050,24678051,88593477

3. 常规自幂数计算方法

java">package ui;

import javax.swing.*;

public class Test1 {
    public static void main(String[] args) {
        int count = 0;  //设计一个计数器来统计计算出来的自幂数的个数
        for (int i = 100; i < 999999999; i++) {  //计算一下999999999以内有游多少个自幂数
            int length = String.valueOf(i).length();  //获取当前计算整数的长度
            int sum = 0;  //定义整数,用来统计当前整数的每位数的幂次和
            int temp = i;  // 定义一个临时变量,该值将用于计算
            while(temp>0) {
                int a = temp%10;  // 取出当前数的最后一位,
                temp = temp/10;   // 将当前数除以10,得到余数
                sum+=Math.pow(a,length);  // 计算当前数的幂次和。
            }
            if(sum==i){  // 如果每位数的幂次和与i相等,则输出改数据。
                count++;  
                System.out.println(i);
            }
        }
        System.out.println("共计有 "+ count + " 个自幂数");
    }
}

4.算法代码改进

第一种方法算到9位数的时候,就需要很长时间才能计算出下一位数。分析了算法,我们很多时间是使用在了调用Math.pow算法上,因为每一次循环都要去调用一下。
改进:我们可以将幂次方的结果放在一个数组中,每次使用的时候,都调用这个数组的值,而不用每次都重复计算一次。

java">package ui;

import javax.swing.*;

public class Test1 {
    public static void main(String[] args) {
    // 定义一个二维数组,将每一个一位整数的幂次方都计算保存到数组中。
        double[][] arr =  {{0,1,2,3,4,5,6,7,8,9},
                {0,1,Math.pow(2,2),Math.pow(3,2),Math.pow(4,2),Math.pow(5,2),Math.pow(6,2),Math.pow(7,2),Math.pow(8,2),Math.pow(9,2)},
                {0,1,Math.pow(2,3),Math.pow(3,3),Math.pow(4,3),Math.pow(5,3),Math.pow(6,3),Math.pow(7,3),Math.pow(8,3),Math.pow(9,3)},
                {0,1,Math.pow(2,4),Math.pow(3,4),Math.pow(4,4),Math.pow(5,4),Math.pow(6,4),Math.pow(7,4),Math.pow(8,4),Math.pow(9,4)},
                {0,1,Math.pow(2,5),Math.pow(3,5),Math.pow(4,5),Math.pow(5,5),Math.pow(6,5),Math.pow(7,5),Math.pow(8,5),Math.pow(9,5)},
                {0,1,Math.pow(2,6),Math.pow(3,6),Math.pow(4,6),Math.pow(5,6),Math.pow(6,6),Math.pow(7,6),Math.pow(8,6),Math.pow(9,6)},
                {0,1,Math.pow(2,7),Math.pow(3,7),Math.pow(4,7),Math.pow(5,7),Math.pow(6,7),Math.pow(7,7),Math.pow(8,7),Math.pow(9,7)},
                {0,1,Math.pow(2,8),Math.pow(3,8),Math.pow(4,8),Math.pow(5,8),Math.pow(6,8),Math.pow(7,8),Math.pow(8,8),Math.pow(9,8)},
                {0,1,Math.pow(2,9),Math.pow(3,9),Math.pow(4,9),Math.pow(5,9),Math.pow(6,9),Math.pow(7,9),Math.pow(8,9),Math.pow(9,9)},
                {0,1,Math.pow(2,10),Math.pow(3,10),Math.pow(4,10),Math.pow(5,10),Math.pow(6,10),Math.pow(7,10),Math.pow(8,10),Math.pow(9,10)},
                {0,1,Math.pow(2,11),Math.pow(3,11),Math.pow(4,11),Math.pow(5,11),Math.pow(6,11),Math.pow(7,11),Math.pow(8,11),Math.pow(9,11)},
                {0,1,Math.pow(2,12),Math.pow(3,12),Math.pow(4,12),Math.pow(5,12),Math.pow(6,12),Math.pow(7,12),Math.pow(8,12),Math.pow(9,12)}
        };

        int count = 0;
        for (int i = 100; i < 999999999; i++) {
            int length = String.valueOf(i).length();
            double sum = 0;
            int temp = i;
            while(temp>0) {
                int a = temp%10;
                temp = temp/10;
                sum+=arr[length-1][a];  // 取出二维数组中对应的数据,并与sum相加。
            }
            if(sum==i){
                count++;
                System.out.println(i);
            }
        }
        System.out.println("共计有 "+ count + " 个自幂数");
    }
}

结果截图:
优化前的耗时为1213秒:
在这里插入图片描述

优化后的时间为46s,
修改之后的耗时:


http://www.niftyadmin.cn/n/11921.html

相关文章

回归分析(1)-回归分析的基本概念

1.回归方程 由于x是可控的非随机变量&#xff0c; 而Y 是一个与x有关的随机变量&#xff0c;因此&#xff0c;直接研究变量Y与x之间的相关关系是困难的&#xff0e; 如果注意到随机变量Y的数学期望反映了随机变量Y的平均取值&#xff0c;因此&#xff0c; 可考虑研究EY与x之间的…

java计算机毕业设计高校迎新管理系统源码+mysql数据库+系统+lw文档+部署

java计算机毕业设计高校迎新管理系统源码mysql数据库系统lw文档部署 java计算机毕业设计高校迎新管理系统源码mysql数据库系统lw文档部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&a…

Google Earth Engine(GEE)——样本点提取间隔距离500米提取样本点

假设您已经有了点,只想选择一个满足缓冲标准的子集。在这种情况下,您可以在随机图像上使用 reduceRegions 和最大缩减器,按细胞图像分组。 max reducer 将允许您指定额外的输入(例如:协变量或像素坐标)以携带它找到的任何最大值。 原有代码: var geometry = /* color:…

Git使用教程

Git使用教程 更好的阅读体验 从大一就开始用git了&#xff0c;但是一直以来都是想到哪用到哪&#xff0c;时间一长一些命令就容易忘&#xff0c;这次就系统地记录一下git命名&#xff0c;也方便后续查询 在这里推荐一个可视化学习Git的网站 Git学习 Git基本概念 git工作区…

Java#25(常见算法: 查找算法)

目录 一.基本查找/顺序查找 从0索引开始挨个往后找 二.折半查找/二分查找 条件: 数组中的数据必须是有序的 核心逻辑: 每次排查一半的查找范围 优势: 提高查找效率 三.分块查找 分块查找的原则1: 前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序) 分块查…

路由(vue-router)

目录 1. 概念 2.路由的官方地址 3. 下载方式 3.1 通过手动下载安装 3.2 通过脚手架安装 4.基本路由的创建 5. 路由出口&#xff08;路由的视图&#xff09; 6.路由重定向 7. 路由的导航 8. 路由的嵌套 在vue中&#xff0c;组件的渲染只能通过以下两种方式 一、组件的…

22矩阵——向量范数和矩阵范数 : 矩阵范数与向量范数的相容、Numpy计算范数

💖💖感谢各位观看这篇文章,💖💖点赞💖💖、收藏💖💖、你的支持是我前进的动力!💖💖 💖💖感谢你的阅读💖,专栏文章💖持续更新!💖关注不迷路!!💖 矩阵线性代数笔记整理汇总,超全面_ 文章目录 三、矩阵范数与向量范数的相容算子范数矩阵范数…

现代农业信息技术

现代农业信息技术 第一讲:现代农业信息技术概况 第二讲:精准农业与数字农业 第三讲:农业信息检索与获取技术 第四讲:农业数据与资源库技术 第五讲:农业专家与决策支持系统 第六讲:农业信息传播学概述 第七讲:信息技术对农业及当今社会的影响 第一讲:现代农业信息技术概…