题目:
问题描述
输入一个位数K,输出K位范围内的所有水仙花数。
输入格式
输入位数K。
输出格式
每行一个输出相应的水仙花数
样例输入
3
样例输出
153
370
371
407
数据规模和约定
3<=K<=7
算法:
1.键盘输入位数k
2.根据范围k找出d的k次方:for的第一层循环控制输出数据的范围,接下来用while循环,计算每位数的k次方之和
3.打印输出
ps:我在思考的时候认为最难的就是:1.while循环里的内容,即如何计算每位数的k次方之和,int d = t % 10计算每位数的余数,t /= 10每取一个余数,减少他的位数,sum += Math.pow(d, k)计算每位余数k次幂的和。2.把i的值赋值给t,我们需要一个变量来存储和处理i值的副本,以便进行每个位数的操作,而不会改变原始的i值。
代码:
方式一:在蓝桥上,cpu运行超时
import java.util.Scanner;
//原始代码,最初的想法,但是CPU运行超时。原因:for循环里又是while循环,并且for循环的范围太大
public class daffodilnum {
public static void main(String[] args) {
//输入位数k
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int x = (int) Math.pow(10, k - 1);
int y = (int) Math.pow(10, k);
for (int i = x; i < y; i++) {//定义数字i的范围
int t = i;//把i的值赋值给t,必须设置t=i,不然会无限循环,结合下面的if代码就会知道,不然为什么不设置sum==t,而是sum==i
//原因:每次循环中去出i的个位数并进行相应操作,同时不改变原始i的值。通过将i赋值给temp来拆解i。
//这样做的好处是保持了i的原始数据不受影响,从而确保后续的循环迭代仍然使用正确的i值
//换句话说,我们需要一个变量来存储和处理i值的副本,以便进行每个位数的操作,而不会改变原始的i值。
//通过使用t = i,我们可以在每次循环迭代中,将t用作临时变量来拆解i并进行相应计算。
int sum = 0;//每次i取好一个值之后,要进行while循环,每次进行好一轮while循环后都要设置sum=0,
//否则每取一个i的值都会累加到sum上,就会出现逻辑错误
while (t != 0) {
int d = t % 10;//取每位数的余数
sum += Math.pow(d, k);//每位余数k次幂的和
t /= 10;//减少t的位数
}//核心算法
if (sum == i) {
System.out.println(i);
}
}
}
}
方式二:cpu运行速度:250ms,我称之为目前这几种方式中写的最好的代码,实现形式:直接算0-9的k次方,并把他们存在数组中,需要时直接从数组中调用,减少代码重复计算
import java.util.Scanner;
//cpu运行速度:250ms,我称之为目前这几种方式中写的最好的代码,
// 实现形式:直接算0-9的k次方,并把他们存在数组中,需要时直接从数组中调用,减少代码重复计算
public class daffodilnum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int n = 0;
int sumPower[] = new int[10]; // 存放0-9的k次方的结果
for(int i = 0; i <= 9; i++){
sumPower[i] = (int)Math.pow(i,k);
}
int x = (int) Math.pow(10,k - 1);
int y = (int)Math.pow(10,k);
for(int i = x; i < y; i++){
int t = i;
int sum = 0;
while(t != 0){
int d = t % 10;
sum += sumPower[d];
t /= 10;
}
if(sum == i){
System.out.println(i);
}
}
}
方式三:cpu运行速度250ms,定义函数Pow()代替代码中需要计算一个数的k次幂(不使用Math.pow()函数)
import java.util.Scanner;
//cpu运行速度250ms,定义函数Pow()代替代码中需要计算一个数的k次幂(不使用Math.pow()函数)
public class daffodilnum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int x = Pow(10,k - 1);
int y = Pow(10,k);
for(int i = x; i < y; i++){
int t = i;
int sum = 0;
while(t != 0){
int d = t % 10;
int power = Pow(d,k);
sum += power;
t /= 10;
}
if(sum == i){
System.out.println(i);
}
}
}
private static int Pow(int base,int exponent){
int result = 1;
for(int j = 0; j < exponent; j++){ // 使用循环计算 d 的 k 次方
result *= base;
}
return result;
}
}