主题:第46次编程比赛第二题(趣味题)
tiancai007 [专家分:0] 发布于 2006-10-27 23:12:00
一座山上周围有n个洞,顺时针编号为0,1,2,……,n-1。
而一只狼从0号洞开始,顺时针方向计数,每遇到m个洞就进洞找兔子,
例如n=5 m=3 狼经过的洞依次为0,3,1,4,2,0
输入n、m。试问兔子有没有幸免的机会?
编写一个完整的程序 n m 由scanf输入
有幸免的机会输出Y
没有输出N
回复列表 (共19个回复)
12 楼
xieyong456 [专家分:2620] 发布于 2006-10-28 23:45:00
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <cstdio>
#include <cstring>
#include <ctime>
int main(void)
{
int r, n, m;
clock_t start, end;
start = clock();
printf("请输入两个自然数:");
scanf("%d%d", &n, &m);
r = n % m;
while( r != 0 )
{
n = m;
m = r;
r = n % m;
}
if(m > 1)
{
printf("Y\n");
}
else
{
printf("N\n");
}
end = clock();
printf("时间:%f秒\n", (end-start)/(double)CLK_TCK);
return 0;
}
13 楼
hj007 [专家分:0] 发布于 2006-10-29 00:33:00
kd
14 楼
逍遥王 [专家分:80] 发布于 2006-10-29 04:54:00
/*the wolf and the rabbit */
main()
{
void Judgement(int M,int flag,int cave[]);
int n;
int m;
int i;
int cave[10];
printf("input the cave'number:");
scanf("%d",&n);
printf("input the wolf choose:");
scanf("%d",&m);
for(i=0;i<n;i++)
cave[i]=i;
Judgement(n,m,cave);
getch();
}
void Judgement(int M,int flag,int cave[])
{
int i=1;
int begin=1;
int sum=0;
int record[sizeof(cave)/sizeof(cave[0])];
int j=1;
int t;
int flag1;
while(cave[i]!=cave[0])
{
for(i=begin;i<M;i++)
{
sum++;
flag1=0;
if(sum==flag)
{printf("%4d",i);
for(t=0;t<=j;t++)
if(record[t]==cave[i])
flag1=1;
if(flag1!=1)
{
record[j]=cave[i];
j++;
}
sum=0;
break;
}
}
begin=i+1;
if(begin>=M)
begin=0;
}
printf("%4d",j);
if(j<M-1)
printf("Y");
else
printf("N");
}
15 楼
逍遥王 [专家分:80] 发布于 2006-10-29 05:01:00
刚才多打了一行代码.这次没问题了.
/*the wolf and the rabbit */
main()
{
void Judgement(int M,int flag,int cave[]);
int n;
int m;
int i;
int cave[10];
printf("input the cave'number:");
scanf("%d",&n);
printf("input the wolf choose:");
scanf("%d",&m);
for(i=0;i<n;i++)
cave[i]=i;
Judgement(n,m,cave);
getch();
}
void Judgement(int M,int flag,int cave[])
{
int i=1;
int begin=1;
int sum=0;
int record[sizeof(cave)/sizeof(cave[0])];
int j=1;
int t;
int flag1;
while(cave[i]!=cave[0])
{
for(i=begin;i<M;i++)
{
sum++;
flag1=0;
if(sum==flag)
{
for(t=0;t<=j;t++)
if(record[t]==cave[i])
flag1=1;
if(flag1!=1)
{
record[j]=cave[i];
j++;
}
sum=0;
break;
}
}
begin=i+1;
if(begin>=M)
begin=0;
}
printf("%4d",j);
if(j<M-1)
printf("Y");
else
printf("N");
}
16 楼
dfjui [专家分:50] 发布于 2006-10-29 10:11:00
//不好意思,只会TC编译,等下次学了VC在换.n是洞数量
#include<stdio.h>
#define MAX 30000
main()
{int i,j=-1,a=0,b[MAX],m,n,s=0,k;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{if(i!=j+1 && s==n)
break;
a=a+m;
if(a>n)
a=a-n;
b[i]=a;
k=0;
for(j=0;j<i;j++)
{if(a==b[j])
break;
k++;
}
if(k==i)
s++;
}
if(s==n)
printf("wu xin mian");
else printf("ke yi xin mian");
}
17 楼
rickone [专家分:15390] 发布于 2006-10-29 10:18:00
//方程m*x=1(mod n),存在解的条件是gcd(n,m)=1
int gcd(int a,int b)
{
if(a==0)
return b;
if(b==0)
return a;
return gcd(b,a%b);
}
int main(void)
{
int n,m;
while(EOF!=scanf("%d%d",&n,&m)
{
if(gcd(n,m)==1)
printf("N\n");
else
printf("Y\n");
}
}
18 楼
Dollybol [专家分:250] 发布于 2006-10-29 16:31:00
/*能力有限,只能做第二题!刚接触数据结构,不过想了下,不知道这题用不用数据结构写!指点一下~~~呵呵~~~
仔细看了下,一般的程序就能解决了.我的思想是:当循环返回
时第一个返回点肯定是起点,所以得知0——(n-1)之间的数只
记录了一次.所以如果把每次进入的洞口号累加至返回到起点
时结束!用所有洞口号之和减去经过了的洞口号之和,结果如果
大于0,则说明兔子能幸免,否则不能!另外想请教第一题该用什么数据结构
看了下,好像前面三章的结构都不好解决,是否用到了后面的图和树结构找到最优啊?*/
#include<stdio.h>
main()
{
int n,m,z=0,record=0;
int i,plus=0;
printf("Please input n m:");
scanf("%d %d",&n,&m);
for(i=0;i<n;i++) z+=i;
record=record+m;
plus+=m;
if(record==n)
{
printf("Y\n");
getch();
return 1;
}
do
{
record=record+m;
if(record>(n-1))
{
record=record-n;
plus+=m;
}
else plus+=m;
}while(record!=0);
if(z-plus>0) printf("Y\n");
else printf("N\n");
getch();
return 1;
}
19 楼
Dollybol [专家分:250] 发布于 2006-10-29 16:44:00
18楼补充,在WIN_TC下通过!
我来回复