题目原文:类斐波那契循环数
解题思路
(1)既然是求0到10000000中,最大的类斐波那契循环数;那么我们应该从10000000开始,从大到小开始判断。
(2)对于197,位数n为3,对应的数列S为{1,9,7,17,33,57,107,197,...}.对于d0=1,d1=7,d2=9,可以直接通过197取余和做除法得到。同时,d3为数列前n项,即d3=d0+d1+d2。同理,d4=d1+d2+d3.通过观察,其实d4=d3+(d3-d0),推广就是当k>n时,如下公式
通过以上公式,当n和很多大的时候,我们也能快速计算出数列下一项的值。
源代码
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
int n=1000*1000*10;
while(n>=197) {
if(isFibonacci(n)) {
System.out.println(n);
return;
};
n--;
}
System.out.println(n);
}
static boolean isFibonacci(long num) {
//得到数列中,第0到n-1个数的值
List<Integer> list = convert(num);
int n = list.size();
int d = 0;
int k = 0;
for (Integer i : list) {
d += i;
}
//设置数列中,第n个的值
list.add(d);
k = list.size() - 1;
do {
d = d + (d - list.get(k - n));
list.add(d);
k++;
} while (d <num);
return d ==num;
}
static List<Integer> convert(long num) {
long n = num;
ArrayList<Integer> list = new ArrayList<Integer>();
do {
list.add((int) (n % 10));
n = n / 10;
} while (n > 0);
List<Integer> list2 = new ArrayList<Integer>();
for (int i = list.size() - 1; i >= 0; i--) {
list2.add(list.get(i));
}
return list2;
}
}
结束