`
universsky
  • 浏览: 99523 次
文章分类
社区版块
存档分类
最新评论

水仙花数----算法3

 
阅读更多
/**
 *
 * @author 东海陈光剑  2013-4-26下午1:00:36
 * flower2.java
 * chenguangjian iSword
 * Email:universsky@126.com
 * Blog: http://blog.sina.com.cn/universsky11/
 *       http://blog.csdn.com/universsky
 *       http://blog.163.com/universsky@126/
 */

package iSword;

/**
 *
 * @author 东海陈光剑  2013-4-26下午1:00:36
 * flower2.java
 * chenguangjian iSword
 * Email:universsky@126.com
 * Blog: http://blog.sina.com.cn/universsky11/
 *       http://blog.csdn.com/universsky
 *       http://blog.163.com/universsky@126/
 */


import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Hashtable;

public class Test {

    public static void main(String[] args) {
        Test test = new Test(21);
        HashSet<BigInteger> set = new HashSet<BigInteger>();
        int s = test.MAX.divide(test.p(9)).intValue();
        for (int i = 0; i <= s; i++) {
            BigInteger temp = test.solve(i);
            if(temp != null) set.add(temp);
        }
        BigInteger[] result = new BigInteger[set.size()];
        set.toArray(result);
        Arrays.sort(result);
        for(BigInteger bi : result){
            System.out.println(bi);
        }
    }

    public Test(int size){
        this.size = size;
        int s = size < 10 ? 10 : size;
        for (int i = 0; i <= s; i++) {
            ht.put("n_" + i, new BigInteger(String.valueOf(i)));
        }
        for (int i = 0; i <= 10; i++) {
            ht.put("p_" + i, new BigInteger(String.valueOf(i)).pow(size));
        }
        MIN = n(10).pow(size - 1);
        MAX = n(10).pow(size).subtract(n(1));
    }

    private int size;

    private int[] array = new int[10];

    private int[] sumArray = new int[10];

    private BigInteger[] totalSum = new BigInteger[10];

    private int index = 0;

    private BigInteger ZERO = BigInteger.ZERO;

    private BigInteger MIN ;

    private BigInteger MAX;

    private Hashtable<String, BigInteger> ht = new Hashtable<String, BigInteger>();

    private BigInteger n(int i) {
        return ht.get("n_" + i);
    }

    private BigInteger p(int i) {
        return ht.get("p_" + i);
    }

    private boolean checkPersentArray() {
        BigInteger minVal = totalSum[index];
        BigInteger maxVal = totalSum[index].add(p(9 - index).multiply(
                n(size - sumArray[index])));
        if (minVal.compareTo(MAX) > 0) {
            return false;
        }
        if (maxVal.compareTo(MIN) < 0) {
            return false;
        }
        String minStr = minVal.compareTo(MIN) > 0 ? minVal.toString() : MIN
                .toString();
        String maxStr = maxVal.compareTo(MAX) < 0 ? maxVal.toString() : MAX
                .toString();
        int[] sameCountArray = new int[10];
        for (int i = 0; i < size; i++) {
            char c;
            if ((c = minStr.charAt(i)) == maxStr.charAt(i)) {
                sameCountArray[c - '0'] = sameCountArray[c - '0'] + 1;
            } else {
                break;
            }
        }
        for (int i = 0; i <= index; i++) {
            if (array[i] < sameCountArray[9 - i]) {
                return false;
            }
        }
        if (sumArray[index] == size) {
            String sumStr = totalSum[index].toString();
            BigInteger sum = ZERO;
            for (int i = 0; i < sumStr.length(); i++) {
                sum = sum.add(p(sumStr.charAt(i) - '0'));
            }
            return sum.compareTo(totalSum[index]) == 0;
        }
        return true;
    }

    private void setValue(int num) {
        array[index] = num;
        if (index == 0) {
            sumArray[index] = num;
            totalSum[index] = p(9 - index).multiply(n(num));
        } else {
            sumArray[index] = sumArray[index - 1] + num;
            totalSum[index] = totalSum[index - 1].add(p(9 - index).multiply(
                    n(num)));
        }
    }

    private boolean back() {
        if (array[index] == 0) {
            while (array[index] == 0) {
                if (index > 0) {
                    index--;
                } else {
                    return true;
                }
            }
        }
        if (index > 0) {
            setValue(array[index] - 1);
            return false;
        } else {
            return true;
        }
    }

    private BigInteger solve(int startValue) {
        index = 0;
        setValue(startValue);
        while (true) {
            if (checkPersentArray()) {
                if (sumArray[index] == size) {
                    return totalSum[index];
                }
                if (index != 9) {
                    index++;
                    setValue(size - sumArray[index - 1]);
                    continue;
                }
            }
            if (back()) {
                break;
            }
        }
        return null;
    }

}



分享到:
评论

相关推荐

    算法练习-水仙花数-少儿编程scratch项目源代码文件案例素材.zip

    在项目案例素材“3-算法练习-水仙花数.sb2”中,包含了完整的源代码,孩子们可以直接运行查看效果,也可以作为参考进行修改和扩展。通过实际操作,孩子们可以自己动手验证不同数字是否为水仙花数,从而加深对水仙花...

    判断水仙花数的算法

    在探讨“判断水仙花数的算法”这一主题时,我们首先需要理解何为水仙花数(Narcissistic number)。水仙花数是指一个n位正整数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如,153是一个三位数,而1^3 + ...

    C#求水仙花数的算法实例

    例如,153 是一个水仙花数,因为 \(1^3 + 5^3 + 3^3 = 153\)。在 C# 编程中,我们可以编写一个函数来查找并打印所有的水仙花数。 下面是一个简单的 C# 算法实例,用于找出100到999之间的所有水仙花数: ```csharp ...

    3--[scratch算法练习-水仙花数].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    3--[scratch算法练习-水仙花数].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码3--[scratch算法练习-水仙花数].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码3--[scratch算法练习-水仙花数].zip...

    求水仙花数

    例如,153是一个水仙花数,因为1的立方是1,5的立方是125,3的立方是27,而1125+27=153。在编程中,我们可以编写一个程序来查找指定范围内的所有水仙花数。在这个例子中,我们关注的是100到1000之间的水仙花数。 ...

    c#求水仙花数算法

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在C#中,实现寻找水仙花数的算法是一项基础练习,它可以帮助我们理解控制流、数学运算以及循环结构等基本概念。 首先,我们需要创建一个方法来检查一个数字...

    水仙花数的算法

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。这个概念在计算机科学中常用于教学,因为它提供了一个简单的算法实现例子。 水仙花数的算法实现主要涉及以下几个步骤: 1. **定义范围**:由于水仙花数是三...

    java水仙花数算法

    在探讨“Java水仙花数算法”的过程中,我们首先需要理解什么是水仙花数,以及如何用Java编程语言实现其算法。水仙花数(Narcissistic number),也被称为自恋数或阿姆斯特朗数,指的是一个n位数等于它的每个数字的n...

    求水仙花数C++,两种判断

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。这种数字在计算机科学和数学中是一个有趣的特例,常被用来作为编程练习来熟悉数字处理。 首先,我们来看第一种算法,即输入一个数判断它是否为水仙花数。这个...

    Python水仙花数

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。 在Python编程中,判断一个数是否为水仙花数可以通过以下步骤实现: 1. **定义函数**:首先,我们需要定义一个函数,接收一个整数作为参数。这个函数将用于...

    21位水仙花数JAVA代码

    例如,153是一个3位的水仙花数,因为1^3 + 5^3 + 3^3 = 153。 对于21位的水仙花数而言,它需要满足以下条件:所有位上的数字的21次幂之和等于该数本身。这类数非常罕见,由于其位数较多,因此计算上存在一定的挑战...

    水仙花数Java程序实现

    例如,153就是一个典型的水仙花数,因为1^3 + 5^3 + 3^3 = 153。 #### 二、Java实现分析 接下来,我们将对给出的Java代码进行详细解析: ```java package com; // 定义包名 public class Math { // 定义公共类...

    C语言编程求水仙花数

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。 要编写一个C语言程序来找出100到999之间的所有水仙花数,我们需要遵循以下步骤: 1. **循环遍历**:首先,我们创建一个for循环,从100遍历到999。这样可以...

    21位水仙花数

    例如,153就是一个典型的3位水仙花数,因为1^3 + 5^3 + 3^3 = 153。 ### 二、21位水仙花数的理解 #### 1. 题目背景 本题目来源于国信蓝点杯第二届决赛的最后一题,要求找出所有21位的水仙花数。题目难度较高,需要...

    七种方法求水仙花数

    例如,153就是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。下面我们将介绍七种不同的方法来求水仙花数,分别使用OpenMP、MPI、MFC、Java等技术。 OpenMP方法 OpenMP是一种并行编程模型,使用#pragma omp parallel ...

    0水仙花数0

    例如,153是一个3位的水仙花数,因为1^3 + 5^3 + 3^3 = 153。在编程领域,寻找水仙花数是一种常见的算法练习,用于测试和提升逻辑思维与编程技巧。 给定的代码片段展示了如何用C语言找出100到1000之间的所有水仙花...

    水仙花数.rar 水仙花数.rar c++实例

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在C++编程中,实现寻找水仙花数的程序可以帮助我们理解位操作、循环控制和条件判断等基本概念。 首先,我们需要了解C++中的循环结构。这里通常会用到for循环...

    matlab版水仙花数程序(两种经典方法)

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在本压缩包中,包含了一个名为`sxh.m`的MATLAB程序文件,用于查找并打印所有三位水仙花数。 以下是两个经典方法的详细解释: 1. **三层for循环**: 这种...

    编程求解水仙花数(Matlab)

    在编程领域,水仙花数是一种特殊的三位数(在本...总的来说,这个 Matlab 程序提供了一种有效的算法来查找特定位数的水仙花数,通过理解并应用这些编程技巧,我们可以学习到如何在实际问题中利用数学和编程来解决问题。

    升序排列数组、求水仙花数

    例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。求水仙花数的算法通常包括遍历100到999之间的所有数字,对每个数字计算其各位数的立方和,如果相等则为水仙花数。这个过程可以很好地帮助初学者理解数字运算和...

Global site tag (gtag.js) - Google Analytics