Java扩展水仙花数求解程序解析
题目代码分析
以下是需要补全的Java代码,功能是寻找并保存指定范围内的扩展水仙花数(4位自幂数):
import java.util.Scanner;
import java.io.*;
public class Java_2 {
int fourthPower(int n) {
return n*n*n*n;
}
int narcissiExt(int fromNum,int number[]) {
int i=0;
int m=fromNum;
int m1=m%10;
int m2=(m/10)%10;
int m3=(m/100)%10;
//**********Found**********
int _________________;
for(m=fromNum;m<=9999;m++) {
int sum=fourthPower(m1)+fourthPower(m2)+fourthPower(m3)+fourthPower(m4);
//**********Found**********
if( _____________ ) {
number[i]=m;
//**********Found**********
__________________;
}
m1=m1+1;
if(m1==10) {
m1=0;
m2=m2+1;
if(m2==10) {
//**********Found**********
_______________;
m3=m3+1;
if(m3==10) {
m3=0;
m4=m4+1;
}
}
}
}
return i;
}
public static void main(String[] args) throws Exception{
Scanner input = new Scanner(System.in);
System.out.println("Input a number:");
int n = input.nextInt();
input.close();
int[] num= new int [10];
int counter=new Java_2().narcissiExt(n,num);
//**********Found**********
PrintWriter pw=new ____________________ ("java_2.txt");
pw.print("There are "+counter+" extended Narcissistic numbers ");
pw.println(" >= "+n+". They are:");
for(int i=0;i<counter;i++) {
pw.println(num[i]);
}
//**********Found**********
______________;
}
}
空白处解析
第一个空白处:
int _________________;
- 解析:程序处理的是4位自幂数,需要定义第四位数字的变量
- 答案:
m4 = (m / 1000) % 10
第二个空白处:
if( _____________ )
- 解析:判断当前数字是否为自幂数(各位数字的4次方和等于该数本身)
- 答案:
sum == m
第三个空白处:
__________________;
- 解析:找到符合条件的数字后,需要递增数组索引
- 答案:
i++
第四个空白处:
_______________;
- 解析:处理数字进位,当m2达到10时应重置为0
- 答案:
m2 = 0
第五个空白处:
PrintWriter pw=new ____________________ ("java_2.txt");
- 解析:创建文件输出流,需要实例化PrintWriter类
- 答案:
PrintWriter
第六个空白处:
______________;
- 解析:使用完输出流后需要关闭以释放资源
- 答案:
pw.close()
完整正确代码
Java实现扩展水仙花数(4位自幂数)的查找与保存
自幂数是指一个n位数,它的每个位上的数字的n次幂之和等于它本身。例如,3位数的水仙花数是指各位数字的3次方和等于该数本身。本文将介绍如何使用Java寻找4位自幂数(扩展水仙花数)并将结果保存到文件中。
1. 程序功能概述
这个程序实现了以下功能:
- 接收用户输入的起始数字
- 查找从起始数字到9999之间的所有4位自幂数
- 将查找结果保存到文本文件中
4位自幂数是指一个4位数,其各位数字的4次方之和等于该数本身。例如,1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴。
2. 核心算法解析
2.1 计算数字的4次方
程序首先定义了一个辅助方法fourthPower
,用于计算一个数字的4次方:
int fourthPower(int n) {
return n * n * n * n;
}
这个方法简单直接,通过连续乘法实现4次方计算。
2.2 分解4位数字的各位
对于一个4位数字m,程序将其分解为个位、十位、百位和千位:
int m1 = m % 10; // 个位数字:m除以10的余数
int m2 = (m / 10) % 10; // 十位数字:m除以10后再取余10
int m3 = (m / 100) % 10; // 百位数字:m除以100后再取余10
int m4 = (m / 1000) % 10; // 千位数字:m除以1000后再取余10
2.3 自幂数判断逻辑
程序通过循环遍历所有4位数字,对每个数字进行判断:
int sum = fourthPower(m1) + fourthPower(m2) + fourthPower(m3) + fourthPower(m4);
if(sum == m) {
number[i] = m;
i++;
}
如果各位数字的4次方和等于该数字本身,则判定为4位自幂数,并将其存入数组。
2.4 数字进位处理
为了避免重复分解数字,程序采用了手动进位的方式更新各位数字:
m1 = m1 + 1;
if(m1 == 10) {
m1 = 0;
m2 = m2 + 1;
if(m2 == 10) {
m2 = 0;
m3 = m3 + 1;
if(m3 == 10) {
m3 = 0;
m4 = m4 + 1;
}
}
}
这种方式模拟了数字的自然递增过程,提高了程序效率。
2.5 文件输出功能
程序使用PrintWriter
类将结果写入文件:
PrintWriter pw = new PrintWriter("java_2.txt");
// 写入内容
pw.close();
使用完输出流后必须调用close()
方法关闭,以确保数据正确写入文件。
3. 程序运行示例
当用户输入起始数字1000时,程序会找到所有4位自幂数:1634、8208、9474,并将结果写入java_2.txt
文件:
There are 3 extended Narcissistic numbers >= 1000. They are:
1634
8208
9474
4. 代码优化建议
这个程序可以从以下几个方面进行优化:
- 动态数组存储:使用
ArrayList
替代固定大小的数组,处理不确定数量的结果 - 通用化处理:修改程序使其能够处理任意位数的自幂数
- 输入验证:添加输入验证,确保用户输入的是有效的4位数字范围
- 异常处理:增加文件操作的异常处理,提高程序健壮性
- 算法优化:使用更高效的数字分解方法,避免手动进位的复杂逻辑
通过这个实例,我们学习了数字分解、循环控制、数组操作和文件IO等Java基础知识,同时也了解了自幂数的数学概念。这些知识在解决类似的数学问题和数据处理任务中非常有用。