算法提高 寻找水仙花数

题目:

问题描述

  输入一个位数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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子LXY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值