任务描述
本关任务:从键盘接收2个整数a和b,输出a与b范围内的水仙花数。
相关知识
1.水仙花数
水仙花数是指:一个n位数( n23 ),它的每个位上的数字的n 次所谓的水仙花数是指:一个n位数(N23),它的每个位上的数字的n次幂之和等于它本身幂之和等于它本身。
例如:153,370,371,407等都是水仙花数,就拿153来说,153 =111 +555 +333. 幂之和等于它本身.例如153,370,371,407等都是水仙花数,就拿153来说,153=111+55+33。 样例:
public class ShuiXianHua {
public static void main(String[] args) {
//1.遍历所有的三位数
for(int i=100;i<=999;i++){
if(isAim(i)){//调用方法如果是水仙花数,就打印
System.out.println(i);
}
}
}
//例 153
public static boolean isAim(int a){
int x=a/100;//结果取整 分解出百位数1
int y=a/10%10;//分解出十位数 除10取证后为15 %10取余后为5
int z=a%10;//直接对10取余得3
if(a==x*x*x+y*y*y+z*z*z){//判断是否为水仙花数
return true;
}
return false;
}
}
编程要求
根据提示,在右侧编辑器补充代码,从键盘接收2个整数a和b,输出a与b范围内的水仙花数。
测试说明
平台会对你编写的代码进行测试:
测试输入:
1
200
预期输出:1
153
测试输入:
2
6
预期输出:2~6范围内无水仙花数!
开始你的任务吧,祝你成功!
这个问题看似十分简单,只要用到while加上“/”符号就可以把一个数的每个位数都被当做个位数提取出来
while(m != 0){
sum += (m % 10) * (m % 10) * (m % 10);
m = m / 10;
}
看起来就是这么回事了但是
package step4;
import java.util.Scanner;
public class narcissisticNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//获取起始范围
int i = scanner.nextInt();
//获取终止范围
int j = scanner.nextInt();
// ---------------------Begin------------------------
int sum = 0;
int n = 0;
for(int k = i ; k <= j ; k ++){
while( k != 0 ){
int sum += ( k % 10 ) * ( k % 10 ) * ( k % 10 );
k = k / 10;
}
if(sum == k){
System.out.println(k);
n ++;
}
}
if(n == 0)
System.out.println(i + "~" + j +"范围内无水仙花数!");
// ---------------------End------------------------
}
}
你发现了问题吗?
数据溢出了。我没有在一个数字(各个位数数字提取)的循环结束后的把k和sum给清除,但是幸好我问了老师,老师指出了我的问题(没问老师的话,我将会搞到地老天荒)。
请一定要记住
1.不要去改动for循环(while循环也一样)里面的执行条件,要用到那个数值就创建了一个新的参数来接收。如本题。
2.改变了参数的数值不用了的参数最好及时清理掉,小心内存溢出。
3.模块化,多注意这些“不小心”导致的问题,不然遇到的时候很难找到。(把问题拆开来积累,不要揉成一团)