杭电ACM OJ 1021 Fibonacci Again 斐波那次数列 发现规律 简化操作

Fibonacci Again

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 64800    Accepted Submission(s): 30092


Problem Description
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
 

Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
 

Output
Print the word "yes" if 3 divide evenly into F(n).

Print the word "no" if not.
 

Sample Input
      
      
0 1 2 3 4 5
 

Sample Output
      
      
no no yes no no no
翻译:就是这个公式,用递归取做。给一个数字代表求出这个公式的第几位即f(5)比如说。再判断能否整除3,如果可以,输出yes
核心:直接硬做也可以做出来,不过可能超时。我们需要找到规律。第一位7,第二位11.可以看成
3+4
3+4+4
加起来就是3+3+4+4+4
其目的是整除3
可以看成
4
4 4
4 4 4
再进一步
1
1 1
1 1 1
就是
1
2
3
5
8
这种规律。很方便就可以求出来
上代码
//找规律法
int circle2(int n) {
    int sum = 0;
    if (n == 0) {
        return 1;
    }
    if (n == 1) {
        return 2;
    }
    return circle2(n - 1) + circle(n - 2);
}

boolean getResult2() {
    int result = circle2(this.n);
    return isOk(result);
}
下面贴上包含笨办法的完整代码
public class FibonacciAgain1021 {
    int n;
    FibonacciAgain1021(int n) {
        this.n = n;
    }

    //递归:暴力法,不过应该超时
    int circle(int n) {

        if (n == 0) {
            return 7;
        }
        if (n == 1) {
            return 11;
        }

        int num;
        num = circle(n - 1) + circle(n - 2);
        return num;

    }

    boolean isOk(int result) {
        return (result % 3) == 0;
    }

    boolean getResult() {
        int result = circle(this.n);
        return isOk(result);
    }

    //找规律法
    int circle2(int n) {
        int sum = 0;
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return 2;
        }
        return circle2(n - 1) + circle(n - 2);
    }

    boolean getResult2() {
        int result = circle2(this.n);
        return isOk(result);
    }

    public static void main(String[] args) throws Exception {

        FibonacciAgain1021 fibonacciAgain1021 = new FibonacciAgain1021(2);//3在试一下
        boolean result = fibonacciAgain1021.getResult2();
        System.out.println(result + "");

    }
}
(一个acm题,你必须先用暴力法去试试,如果连暴力法都不会,就不要谈更高级优雅的方法了。就算侥幸套算法框架套出来了,对他的理解依然只有皮毛而已)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值