【蓝桥杯】类斐波那契循环数

题目原文类斐波那契循环数

解题思路

(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;
	}
}

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值