您的位置:首页 > 编程语言 > C语言/C++

一个简单数学小游戏C语言代码

2010-10-13 23:14 330 查看
假设排列着100个乒乓球,由两个人轮流拿球装入口袋,能拿到第100个乒乓球的人为胜利者。条件是:每次拿球者至少要拿1个,但最多不能超过5个,问:如果甲最先拿球的人,该拿几个?以后怎么拿就能保证甲能得到第100个乒乓球?
    分析:倒着分析,假如要拿到第一百个球,那么,剩下的球为6到10个,不管乙那几个,甲一定取到第100个。由此可知,只要满足乙取到的数同甲取得数的和满足6到10即可。可以保证甲第一次取后剩下的球的个数为6到10之间数的整数倍。甲以后每次采取的策略就是要保证同该次乙所取球的个数之和为6到10之间你所选得那个数,甲必然取到第100个球。要使进行严密的逻辑要复杂些。下边是我自己编写的C语言实现代码,其中要有一些小的毛病,但大体上的逻辑还正确。

运行环境VC6.0

#include <stdio.h>
void main()
{
   int m;
   void fun1();
   void fun2();
   void fun3();
   void fun4();
   void fun5();
   printf("请输入甲第一次要取得球的个数:");
   scanf("%d",&m);
   switch (m)
   {
   case 1: fun1();
   case 2: fun2();
   case 3: fun3();
   case 4: fun4();
   case 5: fun5();
   default:  printf("所取球的个数违反游戏规则!");
   }
}
void fun1()
{
   int i,j,t;
   int s1=1;
   int s2=0;
   int a[15],b[15];
   for(i=6;i<=10;i++)
   {
      if(99%i==0)
    t=i;
   }
 for(j=0;j<(99/t);j++)
 {
    printf("乙方取得的球的个数:");
    scanf("%d",&b[j]);

    a[j]=t-b[j];
    printf("甲方取得的球的个数:%d/n",a[j]);
    //确定每次所取球的最后一个编号
        s2=s1+b[j];
     s1=s1+b[j]+a[j];
  printf("甲该次所取的最后一个球的编号为:%d/n",s1);
  printf("乙该次取得的最后一个球的编号为:%d/n",s2);
   if(s1==100)
   printf("甲方获得胜利!");
   printf("/n");
 }
 }
void fun2()
{
   int i,j,t;
   int s1=2;
   int s2=0;
   int a[15],b[15];
   for(i=6;i<=10;i++)
   {
      if(98%i==0)
    t=i;
   }
 for(j=0;j<(98/t);j++)
 {
    printf("乙方取得的球的个数:");
    scanf("%d",&b[j]);

    a[j]=t-b[j];
    printf("甲方取得的球的个数:%d/n",a[j]);
    //确定每次所取球的最后一个编号
        s2=s1+b[j];
     s1=s1+b[j]+a[j];
  printf("甲该次所取的最后一个球的编号为:%d/n",s1);
  printf("乙该次取得的最后一个球的编号为:%d/n",s2);
     if(s1==100)
   printf("甲方获得胜利!");
   printf("/n");
 }
 }

void fun3()
{
  int j;
   int s1=3;
   int s2=0;
   int a[50],b[50];
  
 for(j=0;j<50;j++)
 {
    printf("请输入乙要取得球的个数:");
    scanf("%d",&b[j]);
    if(b[j]<0 && b[j]>5)
    printf("输入错误!");
   
    printf("请输入甲要取得球的个数:");
    scanf("%d",&a[j]);
    if(b[j]<0 && a[j]>5)
        printf("输入错误!");
    printf("/n");
       s2=s1+b[j];
    s1=b[j]+a[j]+s1;
  if(s1>=100)
  {
  s1=100;
        printf("甲该次所取的最后一个球的编号为:%d/n",s1);
  printf("甲方获得胜利!/n");
  continue;
  }
  else
        {
  printf("甲该次所取的最后一个球的编号为:%d/n",s1);
        printf("/n");
  }
  if(s2>=100)
  {
  s2=100;
  printf("乙该次所取的最后一个球的编号为:%d/n",s2);
  printf("乙方获得胜利!/n");
  continue;
  }
  else
  {
  printf("乙该次取得的最后一个球的编号为:%d/n",s2);
  printf("/n");
  }
  

}
}
void fun4()
{
   int i,j,t;
   int s1=4;
   int s2=0;
   int a[15],b[15];
   for(i=6;i<=10;i++)
   {
      if(96%i==0)
    t=i;
   }
 for(j=0;j<(96/t);j++)
 {
    printf("乙方取得的球的个数:");
    scanf("%d",&b[j]);

    a[j]=t-b[j];
    printf("甲方取得的球的个数:%d/n",a[j]);
    //确定每次所取球的最后一个编号
        s2=s1+b[j];
     s1=s1+b[j]+a[j];
  printf("甲该次所取的最后一个球的编号为:%d/n",s1);
  printf("乙该次取得的最后一个球的编号为:%d/n",s2);
   if(s1==100)
   printf("甲方获得胜利!");
   printf("/n");
 }
 }

void fun5()
{
  int j;
   int s1=5;
   int s2=0;
   int a[50],b[50];
  
 for(j=0;j<50;j++)
 {
    printf("请输入乙要取得球的个数:");
    scanf("%d",&b[j]);
    if(b[j]<0 && b[j]>5)
    printf("输入错误!");
   
    printf("请输入甲要取得球的个数:");
    scanf("%d",&a[j]);
    if(b[j]<0 && a[j]>5)
        printf("输入错误!");
    printf("/n");
       s2=s1+b[j];
    s1=b[j]+a[j]+s1;
  if(s1>=100)
  {
  s1=100;
        printf("甲该次所取的最后一个球的编号为:%d/n",s1);
  printf("甲方获得胜利!/n");
  continue;
  }
  else
        {
  printf("甲该次所取的最后一个球的编号为:%d/n",s1);
        printf("/n");
  }
  if(s2>=100)
  {
  s2=100;
  printf("乙该次所取的最后一个球的编号为:%d/n",s2);
  printf("乙方获得胜利!/n");
  continue;
  }
  else
  {
  printf("乙该次取得的最后一个球的编号为:%d/n",s2);
  printf("/n");
  }
  

}
}
其中有两个地方不够完美,1,在甲第一次取4个球后,剩下96个,在此6到10被其整除的数有6和8两个数。用for循环由于第一次找到的6在又找到8后被覆盖掉。因此在此少了6这种情况的逻辑分析。2.在找不到可除6到10得整数的这种情况中,由于无法确定循环次数,因此设置循环次数最大量为50,而当球的个数超过100个还算是控制了这一因素,可是却无法跳出整个循环。在这一部分还需要改进。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 游戏 c fun
相关文章推荐