Java求30位以内的自幂数,运行时间要少
时间: 2024-09-15 09:09:50 浏览: 40
自幂数也称为阿姆斯特朗数(Armstrong number),是指一个n位数,其各位数字的n次方和等于该数本身。例如,153是一个3位数,且1^3 + 5^3 + 3^3 = 153。对于30位以内的自幂数,由于位数较多,我们可以采用以下策略进行求解:
1. 由于30位数范围很大(从1到10^30 - 1),我们可以通过数学方法来减少不必要的计算。例如,一个n位的自幂数必须小于n^9(因为最大的n位数为99...9,共n个9,其各位数的9次方和是最大的,但仍然小于n^9)。
2. 使用循环从1遍历到n^9,对于每个数,判断是否为自幂数。判断方法是计算该数每一位的n次方和,然后判断这个和是否等于原始数。
3. 由于30位数的数字非常大,我们可以使用字符串或大数类型来处理这些数字。
下面是用Java编写的示例代码,用来寻找30位以内的自幂数:
```java
import java.math.BigInteger;
public class ArmstrongNumber {
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 记录开始时间
for (int i = 1; i < 30; i++) { // 30位数是10的29次方,所以遍历到29即可
System.out.println("3位数的自幂数有: " + findArmstrongNumbers(i));
}
long endTime = System.currentTimeMillis(); // 记录结束时间
System.out.println("运算耗时:" + (endTime - startTime) + "毫秒");
}
private static BigInteger findArmstrongNumbers(int n) {
BigInteger limit = BigInteger.valueOf(1).pow(n); // 计算n位数的上限
BigInteger current = BigInteger.ONE;
BigInteger sum;
BigInteger result = BigInteger.ZERO;
int digits = String.valueOf(limit).length(); // 获取n位数的位数
while (current.compareTo(limit) < 0) { // 遍历所有n位数
sum = BigInteger.ZERO;
BigInteger temp = current;
// 计算当前数的各位数的n次方和
while (temp.compareTo(BigInteger.ZERO) > 0) {
int digit = temp.mod(BigInteger.TEN).intValue();
sum = sum.add(BigInteger.valueOf(digit).pow(n));
temp = temp.divide(BigInteger.TEN);
}
// 如果各位数的n次方和等于原始数,则打印或记录该数
if (sum.compareTo(current) == 0) {
result = result.add(current);
}
current = current.add(BigInteger.ONE);
}
return result;
}
}
```
注意:上述代码仅用于演示如何寻找自幂数,并没有进行优化,实际上30位以内的自幂数并不多,所以运行时间不会太长。
阅读全文