回 帖 发 新 帖 刷新版面

主题:第46次编程比赛第二题(趣味题)

一座山上周围有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个回复)

11 楼

题意模糊

12 楼

#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 楼

kd

14 楼


/*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 楼


刚才多打了一行代码.这次没问题了.
/*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 楼

//不好意思,只会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 楼

//方程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 楼

/*能力有限,只能做第二题!刚接触数据结构,不过想了下,不知道这题用不用数据结构写!指点一下~~~呵呵~~~
仔细看了下,一般的程序就能解决了.我的思想是:当循环返回
时第一个返回点肯定是起点,所以得知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 楼

18楼补充,在WIN_TC下通过!

我来回复

您尚未登录,请登录后再回复。点此登录或注册