thinking in java test4.8练习(8)(9)(10)吸血鬼数字

练习(8)题目:写一个switch开关语句,为每一个case打印一个消息。然后把这个switch放进for循环来测试每一个case。先让每一个case后面都有break,测试一下会怎样,然后把break删了,看看会怎样。
这个题目很简单,代码如下:

public static void main(String[] args){
        for (int i = 0; i < 5; i++) {
            switch (i){
                case 0:
                    System.out.println("当前为:" + i);
                    break;

                case 1:
                    System.out.println("当前为:" + i);
                    break;

                case 2:
                    System.out.println("当前为:" + i);
                    break;

                case 3:
                    System.out.println("当前为:" + i);
                    break;

                case 4:
                    System.out.println("当前为:" + i);
                    break;
                default:
                    System.out.println("nothing");
            }
        }
    }

控制台输出:
当前为:0
当前为:1
当前为:2
当前为:3
当前为:4

去掉break的结果我们根据switch语句的特性可以猜出,之后每次循环的输出会从当前i的语句开始一直输出到最后一个语句。代码测试后控制台输出如下:
当前为:0
当前为:0
当前为:0
当前为:0
当前为:0
nothing
当前为:1
当前为:1
当前为:1
当前为:1
nothing
当前为:2
当前为:2
当前为:2
nothing
当前为:3
当前为:3
nothing
当前为:4
nothing

练习(9)题目:一个裴波那契数列是由数字1,1,2,3,5,8,13,,21,34等组成,其中每一个数字都是前两个数字之和(从第三个数开始)。创建一个方法,接受一个整数参数。并显示从第一个元素开始总共由该参数指定的个数所构成的所有裴波那契数字。例如,如果运行Java Fibonacci5(其中Fiboacci是类名),那么输出就应该是1,1,2,3,5.
代码如下:

public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入一个参数,表示裴波那契数组的长度");
        int length = scanner.nextInt();
        int[] Fibonacci = new int[length];
        Fibonacci[0] = 1;
        Fibonacci[1] = 1;//初始化前两个数字
        for (int i = 2; i < length; i++) {
            Fibonacci[i] = Fibonacci[i - 1] + Fibonacci[i - 2];
        }
        for (int j:
         Fibonacci){
            System.out.print(j + ",");
        }
    }

这里我们的参数从控制台读取,题目中——运行Java Fibonacci 5的意思其实是从args里读取到参数。关于在IDE中如何在程序运行前给args里输入参数在博文:http://blog.csdn.net/qq_35396447/article/details/52051790 中讲过了,不再重复。
另外,值得一提的是,Java是动态语言,允许在运行时动态的改变程序结构变量类型等等,这里的数组长度可以等控制台输入参数后再确定,而不会像c或c++语言一样必须在运行前定好长度。

练习(10)题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:
1260 = 21 * 60;
1827 = 21 * 87;
2187 = 27 * 81;
写一个程序,找出4位数的所有吸血鬼数字。
题目给定范围4位数,4位数最小为1000,由于题目规定以两个0结尾的数字是不允许的,最小为1001,1001 = 11*91。由因为吸血鬼数字是拆成两个二位数数字相乘,所以最大能到的4位数为9801 = 99*99。
最简单的解题思路是从1001开始,给每个4位数从11开始做除法,知道除数和商刚好符合规则。不过这样程序效率太低。
根据吸血鬼数的特点,我们直接把4位数的4个数字两两组合,相乘后看结果是否符合规则。比如1234有
12*34 12*43 13*24 13*42 14*23 14*32
21*34 21*43 23*41 24*31
31*42 32*41
41*32
共13种。
我们可以嵌套循环运算所有结果。在循环中,我们每次将4个数分成两组,然后两两组合,两两相乘,得到四个结果。将符合规则的数记录下来。再继续下次循环,这里可能会有重复计算,但是考虑重复问题会变得复杂许多,所以暂不考虑。
代码如下:

public class Test4_8_10 {
    public static void main(String[] args){
        int[] eachNum = new int[4];
        int[] smallNum= new int[3];
        for (int i = 1001; i <= 9801; i++) {//遍历所有能拆成两个二位数相乘的4位数
            getEachNum(i,eachNum);
            int firstNumOne,secNumOne,secNumTwo;
            for (int j = 0; j < 4; j++) {
                //复制数组,从eachnum下标1开始,复制给smallnum下标0开始,总共3个数
                System.arraycopy(eachNum, 1, smallNum, 0, 3);
//                System.out.println(smallNum[0] + " " + smallNum[1] + " " + smallNum[2]);
                for (int k = 0; k < 3; k++) {
                    firstNumOne = eachNum[0] * 10 + smallNum[0];
                    secNumOne = smallNum[1] * 10 + smallNum[2];
                    secNumTwo = smallNum[2] * 10 + smallNum[1];
                    isXXG(firstNumOne,secNumOne,i);
                    isXXG(firstNumOne,secNumTwo,i);
                    moveOneStep(smallNum);
                }
                moveOneStep(eachNum);
            }
        }

    }

    /**
     * 将数组内每个数向右移一位,第一个数拿到最后
     * @param eachNum
     * @return
     */
    private static void moveOneStep(int[] eachNum) {
        int temp = eachNum[0];
        for (int i = 0; i < eachNum.length; i++) {
            if (i == (eachNum.length-1)){
                eachNum[i] = temp;
            } else {
                eachNum[i] = eachNum[i + 1];
            }
        }
    }

    /**
     * 判断是否符合规则,是则输出到控制台
     * @param numOne
     * @param numTwo
     * @param i
     */
    private static void isXXG(int numOne, int numTwo, int i) {
        if (numOne * numTwo == i){
            System.out.println("找到吸血鬼数:" + i + "=" + numOne + "*" + numTwo);
        }
    }


    /**
     * 把4位数的每一位数存入数组中
     * @param i
     * @return
     */
    private static void getEachNum(int i,int[] nums) {
        String str = Integer.toString(i);//把数转换为字符串
        for (int j = 0; j < 4; j++) {
//            System.out.println(str);
             nums[j]= Integer.parseInt(String.valueOf(str.charAt(j)));//把四位数从左往右每一位数存入数组中
        }
//        System.out.println(nums[0]+" "+nums[1]+" "+nums[2]+" "+nums[3]);
    }
}

控制台输出:
找到吸血鬼数:1260=21*60
找到吸血鬼数:1260=60*21
找到吸血鬼数:1395=15*93
找到吸血鬼数:1395=93*15
找到吸血鬼数:1435=41*35
找到吸血鬼数:1435=35*41
找到吸血鬼数:1530=51*30
找到吸血鬼数:1530=30*51
找到吸血鬼数:1827=87*21
找到吸血鬼数:1827=21*87
找到吸血鬼数:2187=27*81
找到吸血鬼数:2187=81*27
找到吸血鬼数:6880=80*86
找到吸血鬼数:6880=86*80
找到吸血鬼数:6880=80*86
找到吸血鬼数:6880=86*80

当然以上是笔者自己写的方法,比较低级,其实网上还有许多优秀的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值