There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
Print the word "yes" if 3 divide evenly into F(n).
Print the word "no" if not.
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题,你必须先用暴力法去试试,如果连暴力法都不会,就不要谈更高级优雅的方法了。就算侥幸套算法框架套出来了,对他的理解依然只有皮毛而已)