Gibonacci数列有关,其实就是一个Fibonacci数列有关,只是是在系数和常数上.
G(0)=1,G(1)=t(t为一个随机数)
给出i,G(i),j 三元组,求G(j),如果不存在,则输出为0
很容易推出(找规律即可) 实际上,设 G2=Temp * F2 ,t = temp-1
G(i)=F(i)*t+F(i-1) F表示Fibonacci数列
以下是我写的代码,为了方便输出,引用了c++ cout
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define UINT unsigned int
UINT cd_gibonacci(UINT uiNumA, UINT uiResultA, UINT uiNumB);
UINT fibFun(UINT num);
int main()
{
cout<<cd_gibonacci(1,1,2)<<endl;
cout<<cd_gibonacci(3,5,4)<<endl;
cout<<cd_gibonacci(3,4,6)<<endl;
cout<<cd_gibonacci(2,17801,3)<<endl;
cout<<cd_gibonacci(2,17801,4)<<endl;
return 0;
}
UINT cd_gibonacci(UINT uiNumA, UINT uiResultA, UINT uiNumB)
{
int iTemp = 0;
UINT uiNFiba = 0;
UINT uiNFibb = 0;
UINT uiGibSum = 0;
uiNFiba = fibFun(uiNumA);
uiNFibb = fibFun(uiNumA-1);
if(uiNFiba == uiResultA) //如果此时输入的 就是 fib数列,则直接返回fibFun即可
{
uiGibSum = fibFun(uiNumB);
}
else
{
iTemp =(uiResultA-uiNFiba)/uiNFibb;
if (((uiResultA-uiNFiba)%uiNFibb == 0) && iTemp >=1) //用正向逻辑,减少虚拟分支
{
uiNFiba = fibFun(uiNumB);
uiNFibb = fibFun(uiNumB-1);
uiGibSum = uiNFiba+iTemp*uiNFibb;
}
}
return uiGibSum; //少用return
}
UINT fibFun(UINT num) //之所以没有申请数组,是为了让内存节省空间
{
UINT uiFib0 = 1;
UINT uiFib1 = 1;
UINT uiFibSum = 0;
if((num == 0) || (num ==1)) //若是 0 和 1 则fib数列第一个和第二个 都为1
{
return 1;
}
num = num -1; //这边注意要减1
while(num)
{
uiFibSum = uiFib0 + uiFib1;
uiFib0 = uiFib1;
uiFib1 = uiFibSum;
num--;
}
return uiFibSum;
}
结果如下
当然 fib函数也可以写成下面递归的形式
UINT fibFun(UINT num)
{
if(num == 0 !! num==1)
{
return 1;
}
return fibFun(num-1)+fibFun(num-2);
}