话不多说,首先上菜:
对于这个问题,拿到手,马上想到的是:先求Fibonacci数列,再求余数。但是极其不建议这样暴力计算。因为当n很大时,计算时间较长,还可能发生数值溢出的情况!
所以,这里给出另外一种思路:间接方式求余数
首先,科普一个求余公式:(a+b)% c = (a%c+b%c)%c
这个式子不难理解,可以代值进去试试看。
所以,不难得出:f(n)%m = [f(n-1)+f(n-2)]%m = [f(n-1)%m+f(n-2)%m]%m
由题目可知,最终求f(n)%m,因此令:g(n)=f(n)%m,其中m=10007。
于是求余递推公式为:g(n)=[g(n-1)+g(n-2)]%m
其中,m=10007,g(1)=g(2)=1%m=1
完整代码如下:
#include <iostream>
using namespace std;
int main()
{
int f1=1,f2=1;
int temp=0; //中间变量
int output=0; //输出
long n=0; //初始化输入
cin>>n;
if(n==1||n==2)
{
output=1; //当n=1或2时,输出为1
}
else
{
for(int i=3;i<=n;i++)
{
temp=f2;
f2=(f1+f2)%10007; //当n大于2时,递推计算
f1=temp;
}
output=f2;
}
cout<<output;
}
既然说到了Fibonacci数列,那么这里也贴出C++的实现方法:
#include <iostream>
using namespace std;
int Fibonacci(int n) //Fibonacci数列函数
{
if(n==1||n==2)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
int main()
{
int n=0;
cin>>n;
cout<<Fibonacci(n); //输出Fibonacci数列第n个数
return 0;
}