BC38.变种水仙花数

牛客上的一道初级编程题

题目描述
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1 * 461 + 14 * 61 + 146 * 1

求出 5位数中的所有 Lily Number。

输入描述: 无 输出描述: 一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。

一开始看到题目,觉得简单粗暴的做法应该就可以了
于是,打出了如下代码

//        跑了几分钟没跑出来的粗暴做法
        int[] nums = new int[5];
        for (int tenthound = 1; tenthound < 10; tenthound ++){
    
    
            nums[0] = tenthound;
            for (int thound = 0; thound < 10; thound ++){
    
    
                nums[1] = thound;
                for (int hundred = 0; hundred < 10; hundred ++){
    
    
                    nums[2] = hundred;
                    for (int ten = 0; ten < 10; ten ++){
    
    
                        nums[3] = ten;
                        for (int one = 0; one < 10; thound ++){
    
    
                            nums[4] = one;
                            int key = nums[0]*10000 + nums[1]*1000 + nums[2]*100 + nums[3] *10 + nums[4];
//                            五位数字从中间拆有4种拆法,但第二个数首位为0的时候,得舍去
//                            1-4拆分
                            if (nums[1] != 0){
    
    
                                if (nums[0] * (nums[1]*1000 + nums[2]*100 + nums[3]*10 + nums[4]) ==  key)
                                    System.out.println(key +" ");
                            }
                            if (nums[2] != 0){
    
    
                                if ((nums[0]*10 + nums[1]) * (nums[2]*100 + nums[3]*10 + nums[4]) ==  key)
                                    System.out.println(key +" ");
                            }
                            if (nums[3] != 0){
    
    
                                if ((nums[0]*100 + nums[1]*10 + nums[2]) * ( nums[3]*10 + nums[4]) ==  key)
                                    System.out.println(key +" ");
                            }
                            if (nums[4] != 0){
    
    
                                if ((nums[0]*1000 + nums[1]*100 + nums[2]*10 + nums[3]) * nums[4] ==  key)
                                    System.out.println(key +" ");
                            }
                        }
                    }
                }
            }
        }

点击运行之后,程序跑了两分钟依然没有输出一个数字,立马意识到这个方法行不通。
看了大佬们的做法,返回去看题目,才注意到拆分后的高位数字是除以数位的商,而低位数字是取数位的余数,霎时有种茅塞顿开的感觉。这里引用一个大佬提交的做法

    public static void main(String[] args){
    
    

        for (int i = 10000; i< 100000; i++){
    
    
            int a = (i/10000)*(i%10000) + (i/1000)*(i%1000) + (i/100)*(i%100) + (i/10)*(i%10);
            if (i == a)
                System.out.print(i + " ");
        }
    }

啊这,我只是看了提交的代码没有原文的啊,转载链接就贴题目链接好了…

猜你喜欢

转载自blog.csdn.net/zhanwaifeixue/article/details/114918755