枚举算法(Enumeration algorithm)实例一

(建议电脑看原文链接,平台的排版不太好,太累了。)描述:在n位的整数中,例如153可以满足1^3 + 5^3 + 3^3 = 153,这样的数称之为Armstrong数。

将所有的Armstrong数按小到大排序,试写出一程序找出n位数以下的所有Armstrong数,网上大多数是已知位数求确定位数下的Armstrong数,本题在此基础上提高了一定的难度。

手机浏览图片,电脑用户浏览下面的代码

/**
 * @Author: zhaoyaojing
 * @Email: null
 * @Date: 02/02/2018
 * @Time: 8:53 PM
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ArmstrongNum {
    public ArmstrongNum(){
    }

    /**
     * 枚举法
     * 求n位数以下的所有Armstrong数,也就是10的(n+1)次幂以下的数
     */
    public void getAllArmstrongNum1(int n){

        //从1开始到10的n次幂
        for(int i = 1; i < (int) Math.pow(10, n); i++){

            //sum表示一个i位数等于其个位数的i次方之和,i小于等于n。
            int sum = 0;

            //把每个数查分成i个个位数,放在数组里
            int[] mun = new int[n];

            //获得当下查询值
            int thisNum = i;

            //j为当下查询值的位数
            int j = 0;

            //得到一个存放当下数每位上的数的数组mun
            while (thisNum > 0){
                mun[j] = thisNum % 10;
                thisNum = thisNum / 10;
                ++j;
            }

            //求得sum
            for(int k = 0; k < n; k++){
                sum = sum + (int)Math.pow(mun[k], j);
            }

            //如果i属于Armstrong数,则输出,以一个空格为间隙。
            if(i == sum){
                System.out.print(i + " ");
            }
        }
    }

    public static void main(String[] args) throws Exception, IOException {
        // TODO Auto-generated method stub
        ArmstrongNum armstrongNum = new ArmstrongNum();
        System.out.print("求n位数以下的Armstrong数,请先输入n的值:\n");

        //输入n
        int n = Integer.parseInt(new BufferedReader
                (new InputStreamReader(System.in)).readLine());

        //得到n位数以下的所有Armstrong数
        armstrongNum.getAllArmstrongNum1(n);
    }
}
求n位数以下的Armstrong数,请先输入n的值:
5
1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084

原文发布于微信公众号 - 数据库SQL(SQLdba)

原文发表时间:2018-02-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏owent

再议 C++ 11 Lambda表达式

C++ 11 标准发布,各大编译器都开始支持里面的各种新特性,其中一项比较有意思的就是lambda表达式。

942
来自专栏web前端教室

浅谈数据结构 - 字典

浅淡,真的是很浅。Orz.. 先摆出定义,这里的字典是啥样的? 是以键-值对形式保存数据的一种结构。 现实中比较典型的例子,就是以前的电话本。你想找一个单位的电...

18710
来自专栏小樱的经验随笔

数据结构学习笔记【持续更新】

数据结构概述:   定义:     我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到保存到主存储器(内存)中,     以及在此基础上为实...

2213
来自专栏服务端思维

原型模式 - 通过复制生成实例

在 Java 中,我们可以使用 new 关键字指定类名来生成类的实例。但是,有的时候,我们也会在不指定类名的前提下生成实例,例如像图形编辑器中拖动现有的模型工具...

631
来自专栏coding for love

JS入门难点解析3-作用域

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

742
来自专栏aCloudDeveloper

从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

Top N问题在搜索引擎、推荐系统领域应用很广, 如果用我们较为常见的语言,如C、C++、Java等,代码量至少也得五行,但是用Python的话,只用一个函数就...

20110
来自专栏Albert陈凯

编译型语言、解释型语言、静态类型语言、动态类型语言、强类型语言、弱类型语言概念与区别

编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(li...

39211
来自专栏北京马哥教育

深入 Python 字典的内部实现

字典是通过键(key)索引的,因此,字典也可视作彼此关联的两个数组。下面我们尝试向字典中添加3个键/值(key/value)对: 这些值可通过如下方法访问: 由...

33915
来自专栏Java面试通关手册

最最最常见的Java面试题总结——第二周

String类中使用字符数组:private final char value[]保存字符串,所以String对象是不可变的。StringBuilder与Str...

1062
来自专栏java一日一条

Java 泛型详解

泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类...

695

扫码关注云+社区