| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9891 人关注过本帖
标题:[讨论]第一期题目
只看楼主 加入收藏
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
只要是用格式和数据类型等小错误都会通不过的.

倚天照海花无数,流水高山心自知。
2006-11-12 21:57
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用cwande在2006-11-12 17:48:08的发言:
第一题的代码:
[CODE]#include<stdio.h>
const int M=1001;
int main()
{
int f[M];
int a,b,n,i,j,k;
while(scanf("%ld%ld%ld",&a,&b,&n)&&(a||b||n))
{
f[1]=f[2]=1;
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;
}
j=i-2;
if(n==1||n==2)
printf("1\n");
else
{
k=n%j;
if(k==0)k=j;
printf("%ld\n",f[k]);
}
}
return 0;
}[/CODE]


如果A或B中有一个是7的倍数.且n>1000,它这个程序就不对了.
如果A是7的倍数.
f=(A*f(n-1)+B*f(n-2))%7
=B*f(n-2)

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


2006-11-12 22:01
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

其实根本不会执行到1000的,它在1000之内必定会产生循环.就是要检测是否有循环出现,出现了那以后的就不用再做了.


倚天照海花无数,流水高山心自知。
2006-11-12 22:14
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

第二题格式错了
改正如下

#include<stdio.h>
#include<math.h>
#define M 1000
int main()
{
int x,y,t,sq;
while(EOF!=scanf("%d%d",&x,&y))
{
t=y-x;
if(t==0)
printf("0\n");
else
{
sq=(int)sqrt(t);
if(sq*sq==t)
printf("%d\n",2*sq-1);
else if(t>(sq+1)*(sq+1)-(sq+1))
printf("%d\n",2*(sq+1)-1);
else
printf("%d\n",2*(sq+1)-2);
}
}
return 0;
}


2006-11-12 22:21
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用nuciewth在2006-11-12 22:14:02的发言:

其实根本不会执行到1000的,它在1000之内必定会产生循环.就是要检测是否有循环出现,出现了那以后的就不用再做了.

循环肯定是出现的.但判断条件不一样.
如果A=B=7;
f=(A*f(n-1)+B*f(n-2))%7
=0
也即f[i]一直等于0
if(f[i-1]==1&&f[i]==1)可能成立吗?所以它一定把循环执行完


2006-11-12 22:24
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
else
{
k=n%j;
if(k==0)k=j;
printf("%ld\n",f[k]);
}
他的这个会使n变小.如果在中间判断有两个连续相等的值(并且以前出现过)就可以结束循环的.
对于一重循环到1000应该不会发很多时间吧.

倚天照海花无数,流水高山心自知。
2006-11-12 22:34
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
我不是郭靖斑竹第二个也过了.

倚天照海花无数,流水高山心自知。
2006-11-12 22:35
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

我的第一个代码有问题
改正:

#include<stdio.h>
int T[7][7];
int num[7][7][100];
void T_num()
{
int a,b,index,f1,f2,f,count;
for(a=0;a<7;a++)
for(b=0;b<7;b++)
{
f1=1;
f2=1;
index=0;
count=0;
while(1)
{
f=(a*f2+b*f1)%7;
if(index>2 && f2==num[a][b][0] && f==num[a][b][1])
break;
num[a][b][index++]=f;
f1=f2;
f2=f;
count++;
}
T[a][b]=count-1;
}
}
int main()
{
int a,b;
long n;
T_num();
while(EOF!=scanf("%d%d%ld",&a,&b,&n))
{
if(a==0 && b==0 && n==0)
break;
if(n==1 || n==2)
{
printf("1\n");
continue;
}
a%=7;
b%=7;
printf("%d\n",num[a][b][(n-3)%T[a][b]]);
}
return 0;
}


2006-11-12 23:19
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用nuciewth在2006-11-12 22:34:20的发言:
else
{
k=n%j;
if(k==0)k=j;
printf("%ld\n",f[k]);
}
他的这个会使n变小.如果在中间判断有两个连续相等的值(并且以前出现过)就可以结束循环的.
对于一重循环到1000应该不会发很多时间吧.

cwande的也有问题.

提供一个测试数据
A=6,B=7,n=3000
cwande程序算得6
我改正过的程序算得1

下边这个程序算出来也是1

#include<stdio.h>
int main()
{
int f1=1,f2=1,f,i;
int a=6,b=7;
for(i=3;i<=3000;i++)
{
f=(a*f2+b*f1)%7;
f1=f2;
f2=f;
}
printf("%5d\n",f);
return 0;
}


2006-11-12 23:24
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
我用自己的代码测试一下你给的数据,还真是1.看来浙大ACM的测试数据不太健全.
那cwande的程序还是有点问题.不过的确是AC了.

倚天照海花无数,流水高山心自知。
2006-11-12 23:35
快速回复:[讨论]第一期题目
数据加载中...
 
   



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

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