/***
*
* 传统水仙花数
* 可以传入位数 比如 3
* @param n
*/
public static void tradition(int n) {
long start = System.currentTimeMillis();
if (n <= 0) {
// 抛异常或者什么,提示位数需要大于1
return;
}
double total = Math.pow(10, n);
// n表示位数
long number = 0;
long value;
for (long index = 0; index < total; index++) {
number = 0;
value = index;
while (value > 9) {
String pow_valueString = String.valueOf(value);
int pow = (int) Math.pow(10, pow_valueString.length() - 1);
number = number + (int) Math.pow(value / pow, n); // 水仙花数 计算
value = (long) (value % pow);
}
number += (int) Math.pow(value, n); // 水仙花数 计算
if (number == index) {
System.out.println(index + ":水仙花数");
}
}
long end = System.currentTimeMillis();
System.out.println("总共运行时间:" + (end - start));
}
/****
* 这里 当位数大于4时,该算法超过上一个算法
* 水仙花数 算法优化
* @param n
*/
public static void optimization(int n) {
long start = System.currentTimeMillis();
Map<Integer, Long> numberMap = new HashMap<Integer, Long>();
// 先对计算 pow的进行存储,减少计算次数
//如果使用一个数组来存储会不会好一点
for (int index = 0; index < 10; index++) {
numberMap.put( index, (long) Math.pow(index, n));
}
if (n <= 0) {
// 抛异常或者什么,提示位数需要大于1
return;
}
double total = Math.pow(10, n);
// n表示位数
long number = 0;
long value;
for (long index = 0; index < total; index++) {
number = 0;
value = index;
while (value > 9) {
String pow_valueString = String.valueOf(value);
int pow = (int) Math.pow(10, pow_valueString.length() - 1);
number = number + numberMap.get( (int) (value / pow) ); // 水仙花数 计算
value = (long) (value % pow);
}
number += numberMap.get((int)value); // 水仙花数 计算
if (number == index) {
System.out.println(index + ":水仙花数");
}
}
long end = System.currentTimeMillis();
System.out.println("总共运行时间:" + (end - start));
}
水仙花数Java
最新推荐文章于 2022-03-29 22:02:26 发布