斐波那契数列与吸血鬼数字

写在前面

今天在阅读《Java编程思想》第四章控制执行流程时,看到两个练习题很有趣也很难,在此分享给大家。

斐波那契数列

斐波那契数列是由数字1,1,2,3,5,8,13,21,34等等组成的,其中每一个数字(从第三个数字开始)都是前两个数字的和。创建一个方法,接收一个整数参数,并显示从第一个元素开始总共由参数指定的个数所构成的所有斐波那契数字。例如,如果运行java Fibonacci 5 (其中Fibonacci 是类名),那么输出就应该是1、1、2、3、5。

提示:此题用到递归。

package com.hjp.test;

import java.util.Scanner;

/**
 * 斐波那契数列 1 1 2 3 5 8 13 21 。。。
 * @ClassName: FibonacciSequence 
 * @author: huangjp
 * @date: 2017年3月9日 下午2:30:12
 */
public class FibonacciSequence {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("请输入一个正整数:");
        int n = s.nextInt();
        for(int i=1; i<=n; i++){
            System.out.print(getF(i) + ", ");;
        }
        s.close();
    }
    //使用递归
    static int getF(int n){
        if(n == 1 || n == 2){
            return 1;
        }else{
            return getF(n-1)+getF(n-2);
        }
    }
}/* Output:
请输入一个正整数:
8
1, 1, 2, 3, 5, 8, 13, 21, 
*///~

吸血鬼数字

题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序,例如,下列数字就是吸血鬼数字:
1260 = 21 * 60;
1827 = 21 * 87;
2187 = 27 * 81;
写一个程序,找出4位数的所有吸血鬼数字。

提示:(数字1 * 数字2)% 9 = (数字1 + 数字2) % 9。

package com.hjp.test;

/**
 * 吸血鬼数字:类似1260 = 21 * 60; 
 *                 1827 = 21 * 87的数字;
 * 定义:是指位数为偶数的数字,
 *      可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,
 *      其中从最初的数字中选取的数字可以任意排序,
 * @ClassName: VampireNum 
 * @author: huangjp
 * @date: 2017年3月9日 下午3:24:26
 */
public class VampireNum {

    public static void main(String[] args) {

        int[] startDigit = new int[4];      //相乘的两个数字:2 1 6 0
        int[] productDigit = new int[4];    //乘积(吸血鬼数字):1 2 6 0

        for(int num1 = 10 ; num1 <= 99 ; num1++){
            for(int num2 = 10 ; num2 <= 99 ; num2++){
                //如果num1 * num2 是吸血鬼数字,那么(num1 * num2) % 9 与 (num1 + num2) % 9 的结果相等
                if((num1 + num2) % 9 != (num1 * num2) % 9){
                    continue;
                }

                int product = num1 * num2 ;
                startDigit[0] = num1 / 10;  //num1的十位
                startDigit[1] = num1 % 10;  //num1的个位
                startDigit[2] = num2 / 10;  //num2的十位
                startDigit[3] = num2 % 10;  //num2的个位

                productDigit[0] = product / 1000;                   //千位
                productDigit[1] = (product % 1000) / 100;           //百位
                productDigit[2] = ((product % 1000) % 100) / 10;    //十位
                productDigit[3] = ((product % 1000) % 100) % 10;    //个位

                //判断是否4个数字都一样
                int count = 0;
                for(int x = 0 ; x < 4; x++){
                    for(int y = 0 ; y < 4 ; y++){
                        if(productDigit[x] == startDigit[y]){
                            count++;
                            productDigit[x] = -1;   
                            startDigit[y] = -2;
                            if(count == 4){
                                System.out.println(num1 + "*" + num2 + ":" + product);
                            }
                        }
                    }
                }
            }
        }
    }
}/* Output:
15*93:1395
21*60:1260
21*87:1827
27*81:2187
30*51:1530
35*41:1435
41*35:1435
51*30:1530
60*21:1260
80*86:6880
81*27:2187
86*80:6880
87*21:1827
93*15:1395
*///~

结尾

关于斐波那契数列与吸血鬼数字就分享到这里啦,感兴趣的小伙伴可以加入我们的QQ群:271934368

你可能感兴趣的:(Java编程思想)