一个简单数学小游戏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个还算是控制了这一因素,可是却无法跳出整个循环。在这一部分还需要改进。
分析:倒着分析,假如要拿到第一百个球,那么,剩下的球为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语言代码实现
- 用C语言实现一个简单的计算器代码
- 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- C语言实现的一个简单的猜数小游戏
- Tinyhttpd - 超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client(Qt也有很多第三方HTTP类)
- Ionic 做一个简单的项目(在系统的基础上)Mac(附上代码实现)
- 一个简单的echo服务模型(最原始版本,代码没有优化)
- python通过Tkinter库实现的一个简单的文本编辑器代码
- 一个简单的dos脚本, svn 获取代码 - Tomcat 备份 - Maven 编译 - 停止/启动Tomcat - Tomcat站点 发布
- 如何用一段简单的代码讲述一个悲伤的故事?
- 写一个程序,统计自己C语言共写了多少行代码,Github基本操作
- C语言实现的一个简单链表
- 一个简单的动态编译器,支持C#和VB.NET。当你想测试一些简单的代码的时候可以使用。
- poj3468一个简单的整数问题,我昨天一下午才写好的水代码。
- 一个简单的时间片轮转多道程序内核代码 的实现
- 50行代码实现的一个最简单的基于 DirectShow 的视频播放器
- 一个简单的密码登陆界面。C语言
- 一个简单用C语言实现的日志函数
- 代码简单示意:利用log4j将一个类中不同业务日志记录到不同位置