一.题目分析
24点游戏是经典的纸牌益智游戏。
常见游戏规则:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1)。
随机生成4个代表扑克牌牌面的数字(1-13),分别取出四个数两两分别进行加减乘除运算如果结果为24则程序自动列出所有可能算出24的表达式。
二:算法设计思路
随机数生成4个0-13的数字存放在数组中,然后通过三个函数分别进行输出。Int division();来算除法;int count();将传入的两个数字进行可能的运算;void sign();用来输出符号位。将数组的数分别进行两两进行count运算,再将结果和另外的数字传进去。然后输出所有结果为24的算式。
三:程序实现
#include<stdio.h>
#include <stdlib.h> /*rand()函数头文件*/
int division(int p,int q) /*除法函数,如果余数为0返回商*/
{
if(p%q==0)
return p/q;
else
return 0;
}
int count(int i,int j,int c) /*将两个数进行加减乘除*/
{
int s;
switch(c)
{
case 1:s=i+j;break;
case 2:s=i-j;break;
case 3:s=i*j;break;
case 4:s=division(i,j);break;
}
return s;
}
void sign(int c) /*符号位*/
{
if(c==1)printf("+");
else if(c==2)printf("-");
else if(c==3)printf("*");
else printf("/");
}
int main()
{
int f[4]; /*四个1-13的数*/
int i,j,m,n,k; /*i,j,m,n为数组下标,k为循环变量*/
int a,b,c; /*符号*/
int d1,d2,d3; /*每步的结果*/
for(k=0;k<4;k++) /*产生4个0-13的随机数为数组f赋值*/
{
f[k]=rand()%13;
printf("%d ",f[k]);
}
printf("\n");
for(i=0;i<4;i++) /*分别取出f[i],f[j],f[m],f[n]四个不同的数*/
for(j=0;j<4;j++)
if(j!=i)
for(m=0;m<4;m++)
if(m!=i&&m!=j)
for(n=0;n<4;n++)
if(n!=i&&n!=j&&n!=m)
for(a=1;a<5;a++) /*符号为加减乘除各循环一次*/
for(b=1;b<5;b++)
for(c=1;c<5;c++)
{
d1=count(f[i],f[j],a); /*两两结合*/
d2=count(d1,f[m],b);
d3=count(d2,f[n],c);
if(d3==24) /*最后为结果24则输出*/
{
/*输出表达式*/
printf("(((%d",f[i]);
sign(a);
printf("%d)",f[j]);
sign(b);
printf("%d)",f[m]);
sign(c);
printf("%d)=24\n",f[n]);
}
}
return 0;
}
三:调试、测试及运行结果
调试:没有考虑运算符号的优先级,没有小括号
再输出结果那里添加小括号:
测试:生成4个随机数函数
由键盘输入四个数字
运行结果:
四:总结
看到题目后能想到的就是穷取法一个一个算法列出来,简单粗暴,后来通过查询资料,看其他的算法有很多种解法可以算出来,但是我很难理解,后来在作业帮上看到一种算法思路将它们一个一个数拿出来用for循环两两进行加减乘除,符号也用了三个for 循环。一个函数用来将两个数进行可能的运算再将结果和另一个数进行运算。这种算法有一个缺点就是出现的结果会有重复。刚开始自己的运算结果没有小括号,没有考虑运算符号的优先级,后来再输出结果那里添加了小括号。
我用随机数生成4个0-13的数字存放在数组中,然后通过三个函数分别进行输出。Int division();来算除法;int count();将传入的两个数字进行可能的运算;void sign();用来输出符号位。通过一个游戏认识到自己有很多的不足,很多知识都不懂。接下来我会好好学习,了解一些知识和算法锻炼自己的算法构造能力。