给定f1=1,f2=1,f(n)=a*f(n-1)+b*f(n-2),要求输入a,b,n遇到0 0 0是结束并输出结果1<=a,b<=1000;1<=n<=100,000,000
比如输入
1 1 3
1 2 10
0 0 0
则输出
2
5
要求运行时间是1000ms但是我的程序是1015ms
大家帮帮忙看看能不能帮我减少点运行时间啊
或者帮帮忙写个简单点的程序啊
我感觉我写的太长了
由于考虑到周期较小,所以用动态数组,便于引用!
经过测试一般数据运行耗时基本为0毫秒
代码红色部分考虑的是周期段不一定从第一位开始,故时间复杂度较高
如果认定是从第一位开始,那么红色代码可变为:
if(result[i]==1&&result[i-1]==1)
return *min=0,*max=i-1;
这样显然速度会快一些!但没有理论依据,故选前者!
[CODE]
#include "stdio.h"
#include "alloc.h"
#include "time.h"
#define MAXSIZE 20
#define INCREASESIZE 5
int a,b,*result;
long n;
int Function(int *min,int *max)
{
int i,j, size=MAXSIZE;
result=(int *)malloc(sizeof(int)*size);
if(result==NULL)
exit(-1);
result[0]=result[1]=1;
for(i=2;;i++)
{
if(i>=size)
{
result=(int *)realloc(result,sizeof(int)*(size+INCREASESIZE));
if(result==NULL)
exit(-1);
size+=INCREASESIZE;
}
result[i]=( result[i-1]*a+result[i-2]*b )%7;
for(j=i-1;j>0;j--)
if(result[j]==result[i]&&result[j-1]==result[i-1])
return *min=j-1,*max=i-1;
}
}
int main()
{
int min,max;
while(1)
{
scanf("%d%d%ld",&a,&b,&n);
if(a<1 || a>1000 || b<1 || b>1000 || n<1 || n>100000000)
exit(-1);
Function(&min,&max);
if( n<min )
printf("%d\n\n",result[n-1]);
else
printf("%d\n\n" ,result[(n-1)%(max-min)+min]);
}
free(result);
return 0;
}
[/CODE]