斐波那契的余数

分析这个题目:P的取值是(1,500),所以f(4999)很大很大了,根本就long long型都无法表示,不过,K的取值为[ 1,15),最大2^14=16384, 这个还好处理。然后结合本题斐波那契的余数,首先,斐波那契应该采取怎样的算法求解,目前,我知道的两种,一种是我将要采用的递推法,还有一种是递归法。(注意,尽管这两个方法一字之差,可是完全不一样的),至于我为什么选择递推法,请看https://blog.csdn.net/qq_41045071/article/details/82872129,这个有两者的比较。斐波那契求法选好后,下面就该考虑这么大数和怎么求余了,我采用的是递推过程中就一步一步取余,这样这个数就不会超过16384。下面附上代码:

#include<stdio.h>

int f1(int n,int s)  //用于计算斐波那契数列,这个用到递推法 
{
	int fa,fb,f;
	fa=0%s,fb=1%s;
	if(n==2) return 1;
	for(int i=2;i<n;i++)
	{
		f=(fa+fb)%s;
		fa=fb%s;
		fb=f%s;
	}
	return f;
}

int g(int k)   //这个用于计算2的k次方 
{
	int s=1;
	for(int i=1;i<=k;i++)
		s*=2;
	return s;	
}
int main()
{
	int P,K;  //题目输入值,0<P<5000,1<=K<15 
	int result;
	while(scanf("%d%d",&P,&K)!=EOF) //多组数据输入 
	{
		if(P==0&&K==0) return 0;   //多组输入结束条件 
		else
		{
		result=f1(P,g(K));
		printf("%d\n",result);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41045071/article/details/82911068