Fibonacci数列 斐波那契数列

Fibonacci数列

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。

首先我们可以定义一个数组F,

int F[1000000];

由题可知

F[1]=1;
F[2]=1;

输入一个N

int n;
scanf("%d",&n);

当N<2时输出的就是1,所以

if(n>2){(数据处理*)}

设定一个循环,因为是从F[3]开始算起,所以for的判定条件为:
int i=3;i<=n;i++

Fn的计算就按题目给的Fn=Fn-1+Fn-2来计算。
对于这部分,我们要想到对于结果的处理不能放到最后,因为int的最大值一定比F1,000,000要小数组100%会炸

Boom!

所以我们要在运算时就对每一次的结果进行处理。
7%4=3
3%4=3
可知在运算时我们对斐波那契数列提前取余不会对结果产生影响。
所以表达式变成了

F[i]=(F[i-1]+F[i-2])%10007;

以下是完整代码:

#include
#define falg 10007
main(){
	int n;
	scanf("%d",&n);
	int F[n];
	F[1]=1;
	F[2]=1;
	if(n>2){
	for(int i=3;i<=n;i++){
		F[i]=(F[i-1]+F[i-2])%falg;
		}
	}
	printf("%d",F[n]);
	return 0
} 

另附两个不同解法:
这个是我的另一种解法占用空间较小但是算法更复杂

#include
#define falg 10007
#define M (a1+a2)
main(){
	int a1=1,a2=1,ans,n,i;
	scanf("%d",&n);
	if(n>2){
		int bol =n%2;
		n=(n-2)/2;
		for(i=0;i

引用自百度知道 殛丿殪 的回答

#include
int main(void)
{
int x,y,z,i,n;
x = 0;
y = 0;
z = 1;
i = 0;
scanf("%d",&n);
while(i

你可能感兴趣的:(#编程练习题)