/**
*
* @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;
}
}
分享到:
相关推荐
在项目案例素材“3-算法练习-水仙花数.sb2”中,包含了完整的源代码,孩子们可以直接运行查看效果,也可以作为参考进行修改和扩展。通过实际操作,孩子们可以自己动手验证不同数字是否为水仙花数,从而加深对水仙花...
在探讨“判断水仙花数的算法”这一主题时,我们首先需要理解何为水仙花数(Narcissistic number)。水仙花数是指一个n位正整数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如,153是一个三位数,而1^3 + ...
例如,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...
例如,153是一个水仙花数,因为1的立方是1,5的立方是125,3的立方是27,而1125+27=153。在编程中,我们可以编写一个程序来查找指定范围内的所有水仙花数。在这个例子中,我们关注的是100到1000之间的水仙花数。 ...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在C#中,实现寻找水仙花数的算法是一项基础练习,它可以帮助我们理解控制流、数学运算以及循环结构等基本概念。 首先,我们需要创建一个方法来检查一个数字...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。这个概念在计算机科学中常用于教学,因为它提供了一个简单的算法实现例子。 水仙花数的算法实现主要涉及以下几个步骤: 1. **定义范围**:由于水仙花数是三...
在探讨“Java水仙花数算法”的过程中,我们首先需要理解什么是水仙花数,以及如何用Java编程语言实现其算法。水仙花数(Narcissistic number),也被称为自恋数或阿姆斯特朗数,指的是一个n位数等于它的每个数字的n...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。这种数字在计算机科学和数学中是一个有趣的特例,常被用来作为编程练习来熟悉数字处理。 首先,我们来看第一种算法,即输入一个数判断它是否为水仙花数。这个...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。 在Python编程中,判断一个数是否为水仙花数可以通过以下步骤实现: 1. **定义函数**:首先,我们需要定义一个函数,接收一个整数作为参数。这个函数将用于...
例如,153是一个3位的水仙花数,因为1^3 + 5^3 + 3^3 = 153。 对于21位的水仙花数而言,它需要满足以下条件:所有位上的数字的21次幂之和等于该数本身。这类数非常罕见,由于其位数较多,因此计算上存在一定的挑战...
例如,153就是一个典型的水仙花数,因为1^3 + 5^3 + 3^3 = 153。 #### 二、Java实现分析 接下来,我们将对给出的Java代码进行详细解析: ```java package com; // 定义包名 public class Math { // 定义公共类...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。 要编写一个C语言程序来找出100到999之间的所有水仙花数,我们需要遵循以下步骤: 1. **循环遍历**:首先,我们创建一个for循环,从100遍历到999。这样可以...
例如,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 ...
例如,153是一个3位的水仙花数,因为1^3 + 5^3 + 3^3 = 153。在编程领域,寻找水仙花数是一种常见的算法练习,用于测试和提升逻辑思维与编程技巧。 给定的代码片段展示了如何用C语言找出100到1000之间的所有水仙花...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在C++编程中,实现寻找水仙花数的程序可以帮助我们理解位操作、循环控制和条件判断等基本概念。 首先,我们需要了解C++中的循环结构。这里通常会用到for循环...
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在本压缩包中,包含了一个名为`sxh.m`的MATLAB程序文件,用于查找并打印所有三位水仙花数。 以下是两个经典方法的详细解释: 1. **三层for循环**: 这种...
在编程领域,水仙花数是一种特殊的三位数(在本...总的来说,这个 Matlab 程序提供了一种有效的算法来查找特定位数的水仙花数,通过理解并应用这些编程技巧,我们可以学习到如何在实际问题中利用数学和编程来解决问题。
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。求水仙花数的算法通常包括遍历100到999之间的所有数字,对每个数字计算其各位数的立方和,如果相等则为水仙花数。这个过程可以很好地帮助初学者理解数字运算和...