| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9893 人关注过本帖
标题:[讨论]第一期题目
只看楼主 加入收藏
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
以下是引用nuciewth在2006-11-18 14:59:00的发言:

一般来说用递归都会超时.
既然楼上已经有递归式,那么改成递推或非递归会好一点.

晕,自己把我的程序拷下来运行试试吧,绝对没有超时


2006-11-20 12:29
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
以下是引用nuciewth在2006-11-18 15:02:53的发言:

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)试试


2006-11-20 12:32
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
以下是引用nuciewth在2006-11-18 15:01:51的发言:

今天星期六,我把自己写的贴上来.

#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编辑过]


2006-11-20 12:36
半滴风雨
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-10-6
收藏
得分:0 

这是我写的
感觉和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]);
}


2006-11-20 13:41
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用smartwind在2006-11-20 12:32:03的发言:

这个超时了,输入0 2147483648(即2^31-1)试试

如果会超时我就不会把它帖出来了.


倚天照海花无数,流水高山心自知。
2006-11-24 13:39
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
最后一题应该是动态规划

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2006-11-25 19:54
Music
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-11-9
收藏
得分:0 

我怎么就看不懂呀


﹥ 癫⒊倒⒋啲生萿﹎還會不會_洅í繼х續﹎﹖
2006-12-02 15:44
perfect
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:81
专家分:0
注 册:2006-11-19
收藏
得分:0 
以下是引用我不是郭靖在2006-11-12 22:01:58的发言:


如果A或B中有一个是7的倍数.且n>1000,它这个程序就不对了.
如果A是7的倍数.
f=(A*f(n-1)+B*f(n-2))%7 // A是7的倍数也是正确的
=B*f(n-2) // 只有B是7的倍数或AB都是7的倍数才会出错

此时
if(f[i-1]==1&&f[i]==1)这个是不可能成立的
要改为if(f[i]==1)

cwande的程序大体上是正确的,只是少了一些处理


片言可以明百意 坐驰可以役万里
2006-12-06 10:38
perfect
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:81
专家分:0
注 册:2006-11-19
收藏
得分:0 

#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;
}


片言可以明百意 坐驰可以役万里
2006-12-06 10:42
zero442
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2006-5-26
收藏
得分:0 
nuciewth
希望您能把每一步的目的跟作用写写啊,对于初学者有很大的帮助的啊!
在此我就感谢了啊!我是初学的啊!看了题很难理解啊!拜托了啊!

还是不知道怎么会有这样的想法,但是我永远之爱你一个!!
2006-12-15 20:26
快速回复:[讨论]第一期题目
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026145 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved