一般来说用递归都会超时.
既然楼上已经有递归式,那么改成递推或非递归会好一点.
晕,自己把我的程序拷下来运行试试吧,绝对没有超时
steps
#include<stdio.h>
int main()
{
#ifndef ONLINE_JUDGE
freopen ("steps.txt","r",stdin);
#endif
long n1,n2,sum;
int i,j,flag;
while(EOF!=(scanf("%ld%ld",&n1,&n2)))
{
i=1;
sum=0;
flag=0;
j=0;
while((n2-n1)>sum)
{
sum=sum+i;
flag++;
if(flag==2)
{
i++;
flag=0;
}
j++;
}
printf("%d\n",j);
}
return(0);
}
这个超时了,输入0 2147483648(即2^31-1)试试
今天星期六,我把自己写的贴上来.
#include<stdio.h>
#define N 100
long count[N];
long is_in(long a[],long n)
{
long j;
for(j=n-1;j>=2;j--)
if(a[j]==a[n]&&a[j-1]==a[n-1])
return(n-j);
return(0);
}
int main()
{
#ifdef ONLINE_JUDGE
freopen ("Number Sequence.txt","r",stdin);
#endif
long n;
long a,b,i,t,d;
while(EOF!=(scanf("%ld%ld%ld",&a,&b,&n))&&!(a==0&&b==0&&n==0))
{
i=3;
count[1]=1;
count[2]=1;
while(1)
{
count[i]=(a*count[i-1]+b*count[i-2])%7;
t=is_in(count,i);
if(t!=0)
break;
i++;
}
i=i-t-1;
if(i>n)
printf("%ld\n",count[n]);
else
{
d=(n-i)%t;
if(d==0)
d=d+t;
d=d+i;
printf("%ld\n",count[d]);
}
}
return(0);
}
这个算法不错
[此贴子已经被作者于2006-11-20 12:46:44编辑过]
这是我写的
感觉和bz的算法差不多
#include<stdio.h>
void main()
{
void display(int a,int b,long n);
int a,b;
long n;
printf("输入这三个数\n");
printf("其中0<a<1000,0<b<1000,0<n<10,000,000\n");
scanf("%d%d%ld",&a,&b,&n);
display(a,b,n);
}
void display(int a,int b,long n)
{
int ar[50],i;
ar[1]=1,ar[2]=1;
a = a%7,b = b%7;
if(a%7==0&&b%7==0)
{
if(n==1||n==2)
printf("%d",1);
else
printf("%d",0);
return 0;
}
for(i=3;i<=49;i++)
ar[i]=(a*ar[i-1]+b*ar[i-2])%7;
for(i=3;i<=49;i++)
if(ar[i]*ar[i+1]==1)
break;
i--;
ar[0]=ar[i];
printf("%d",ar[n%i]);
}
#include<stdio.h>
#define M 1001
int main()
{
int f[M];
int a,b,i,j,k;
long n;
while(scanf("%d%d%ld",&a,&b,&n)&&(a||b||n))
{
f[1]=f[2]=1;
a%=7; b%=7;
for(i=3;i<=1000;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i-1]==1&&f[i]==1)break;
if(b==0 && f[i]==f[3] && i!=3) break;
}
j=i-2;
if(n==1||n==2)
printf("1\n");
else
{
if(b==0)
{ n-=2; j-=1; } // 若B为0,则应从第3个算起,要再减1
k=n%j;
if(k==0)k=j;
if(b==0)
if(j==1) // A B 均为0时,周期是1,对任何数都是0
k=3;
else
k+=2;
printf("%d\n",f[k]);
}
}
return 0;
}