Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
int a1, a2;
a1 = a2 = 1;
int sum = 0, temp;//sum是保存余数的变量 ,temp是为了方便交换数据
long n;//因为n>=1 and n<=1000000
cin >> n;
for (long i = 1; i <= n; i++)
{
sum = a1 % 10007;
temp = a2;
a2 = (a1 + a2) % 10007;
a1 = temp;
}
cout << sum;
上面的for循环是什么意思?
for循环就是依次找Fibonacci数列的第i + 1(a1)和第i + 2项(a2)的值啊
因为递归虽然写起来非常方便,但是非常消耗空间,因此还需要掌握非递归算法,下图是递归算法之后的结果
那么,如何解决呢?
思路:用for循环
#include <cstdio>
int main()
{
int n,Fn;
scanf("%d",&n);
int F1=1; //初始化
int F2=1;
for(n=n-2;n>0;n=n-2)
{
F1=(F1+F2);
F2=(F1+F2);
}
Fn=F1;
if(n==0) //判断输出哪个位置上的数字
Fn=F2;
printf("%d\n",Fn);
}
举个例子就能看懂了吧
就是用两个变量来循环相加。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a1, a2;
a1 = a2 = 1;
int sum = 0, temp;//sum是保存余数的变量 ,temp是为了方便交换数据
long n;//因为n>=1 and n<=1000000
cin >> n;
for (long long i = 1; i <= n; i++)
{
sum = a1 % 10007;
temp = a2;
a2 = (a1 + a2) % 10007;
a1 = temp;
}
cout << sum;
}