转---输入4个数求24点C语言源代码

合集下载

C语言写的24点游戏

C语言写的24点游戏
else
if((m%4)==0&&newp[j]%newp[q]==0&&c==3&&newp[q+1]%s2==0)
printf("%d%c((%d%c%d)%c%d)=%d\n",p[3],p1[2],p[0],p1[0],p[1],p1[1],p[2],s3);
}
}
}
}
}
}
}
}
for(c=0;c<4;c++)
{
switch(b[c])
{
case 1:s3=s2+newp[q+1];sign='+';break;
case 2:s3=s2-newp[q+1];sign='-';break;
int a[4],newp[4],b[4]={1,2,3,4};//a[4]数组存放随机生成的四个数
char p1[3],sign; //定义存储运算符的字符数组
printf("四个数是:");
for(i=0;i<4;i++)
{
a[i]=rand()%13+1; //获得随机数
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s3);
else
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s3);

经典游戏--24点--c++代码实现和总体思路(简单暴力向)

经典游戏--24点--c++代码实现和总体思路(简单暴力向)

经典游戏--24点--c++代码实现和总体思路(简单暴⼒向)24点 24点是⼀个⾮常经典的游戏,从扑克牌⾥抽4张牌,其中J=11,Q=12,K=13,然后经过+,-,*,/,(),的计算后,使得计算得值为24,例如抽到1,2,2,5四张牌,那么 (1+5)*(2+2)=24; 这就是可以凑成24点的⼀种情况,作为⼀个经典题⽬,在leetcode上也有对应的题⽬进⾏练习 PS 看见知乎⼤佬有⼀种必24点的算法,但是要⽤到阶乘和次⽅式⼦为(a0+b0+c0+d0)! =24⼀、总体思路 1.因为是简单暴⼒向的,所以我们的做法就是直接穷举出所有可能的情况,⾸先是考虑四个数a,b,c,d的排列情况 如b,a,c,d等等,通过排列组合可以得到 4*3*2*1 = 24 种情况 2.然后考虑a,b,c,d中的三个运算符的情况设⼀个⾃定义的运算符为,可以是+,-,*,/中的任意⼀个 则有 a b c$d 这个式⼦,同样,运算符的可能性有 3*4 = 12 种 3.最后考虑()的情况,我们规定,每次⼀对()只框住两个数,⽐如a+b+c+d =(((a+b)+c)+d) = ((r1+c)+d)=(r2+d)=r3(其中r1=a+b,r2=r1+c,r3=r2+d) ()的情况其实就是运算优先级的问题,⽆论运算符是什么,都⼀定是先运算括号⾥的内容 所以我们可以穷举出情况 第⼀种r1=a b,r2=r1c,r3=r2$d; 第⼆种r1=b c,r2=a r1,r3=r2$d; 第三种r1=b c,r2=r1d,r3=a$r2; 第四种r1=c d,r2=b r1,r3=a$r2; 第五种r1=a b,r2=c d,r3=r1$r2; 仔细观察不难发现,我们控制了运算符和数字的绝对顺序从左到右的顺序严格是a b c$d,不论任何情况都不会改变abcd的顺序,是因为我们在上⾯已经排出来了所有的24种情况,所以我们这就可以严格控制abcd的顺序了⼆、代码实现1 #include <iostream>2 #include <string>3using namespace std;4int mark_int[4] = { 1,2,3,4 };5string mark_char = "+-*/";6double cal(double a, int m, double b)7 {8switch (m)9 {10case1: return a + b;11case2: return a - b;12case3: return a * b;13case4: return a / b;14 }15 }1617bool cal1(double a, double b, double c, double d, int m1, int m2, int m3)18 {19double r1;20double r2;21double r3;22 r1 = cal(a, m1, b);25if (r3 == 24)26 {27 cout << "(((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << ")" << endl;28return1;29 }30return0;31 }3233bool cal2(int a, int b, int c, int d, int m1, int m2, int m3)34 {35double r1;36double r2;37double r3;38 r1 = cal(b, m1, c);39 r2 = cal(a, m2, r1);40 r3 = cal(r2, m3, d);41if (r3 == 24)42 {43 cout << "((" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << c << "))" << mark_char[m3 - 1] << d << ")" << endl;44return1;45 }46return0;47 }4849bool cal3(int a, int b, int c, int d, int m1, int m2, int m3)50 {51double r1;52double r2;53double r3;54 r1 = cal(b, m1, c);55 r2 = cal(r1, m2, d);56 r3 = cal(a, m3, r2);57if (r3 == 24)58 {59 cout << "(" << a << mark_char[m1 - 1] << "((" << b << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << "))" << endl;60return1;61 }62return0;63 }6465bool cal4(int a, int b, int c, int d, int m1, int m2, int m3)66 {67double r1;68double r2;69double r3;70 r1 = cal(c, m1, d);71 r2 = cal(b, m2, r1);72 r3 = cal(a, m3, r2);73if (r3 == 24)74 {75 cout << "(" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << ")))" << endl;76return1;77 }78return0;79 }8081bool cal5(int a, int b, int c, int d, int m1, int m2, int m3)82 {83double r1;84double r2;85double r3;86 r1 = cal(a, m1, b);87 r2 = cal(c, m3, d);88 r3 = cal(r1, m2, r2);89if (r3 == 24)90 {91 cout << "((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << "))" << endl;92return1;93 }94return0;95 }969798bool all_cal(int a, int b, int c, int d)99 {100for (int i = 1; i <= 4; i++)101for (int j = 1; j <= 4; j++)102for (int k = 1; k <= 4; k++)103 {104if (cal1(a, b, c, d, i, j, k) == true || cal2(a, b, c, d, i, j, k) == true || cal3(a, b, c, d, i, j, k) == true || cal4(a, b, c, d, i, j, k) == true || cal5(a, b, c, d, i, j, k) == true) 105return1;106 }107return0;108 }110111bool judge(int a, int b, int c, int d)112 {113int all[24][4] = {114 {a,b,c,d},{a,b,d,c},{a,c,b,d},{a,c,d,b},{a,d,b,c},{a,d,c,b},115 {b,a,c,d},{b,a,d,c},{b,c,a,d},{b,c,d,a},{b,d,a,c},{b,d,c,a},116 {c,a,b,d},{c,a,d,b},{c,b,a,d},{c,b,d,a},{c,d,a,b},{c,d,b,a},117 {d,a,b,d},{d,a,d,b},{d,b,a,c},{d,b,c,a},{d,c,a,b},{d,c,b,a},118 };119for (int i = 0; i < 24; i++)120 {121if (all_cal(all[i][0], all[i][1], all[i][2], all[i][3]))122return1;123 }124return0;125 }126127int main()128 {129int a, b, c, d;130 cin >> a >> b >> c >> d;131if (!judge(a, b, c, d))132 cout << "凑不成24点" << endl;133134 }三、代码解释先做⼀个计算两个数的函数,⽤数组int mark_int[4] = {1,2,3,4}的四个数表⽰+ - * /,string mark_char是⽤来最后显⽰的1int mark_int[4] = { 1,2,3,4 };2string mark_char = "+-*/";3double cal(double a, int m, double b)4 {5switch (m)//⽤switch来进⾏运算符的选择6 {7case1: return a + b;8case2: return a - b;9case3: return a * b;10case4: return a / b;11 }12 }我们在实现五种括号的函数,并且我们规定运算⼀定是 a m1 b m2 c m3 d(m1,m2,m3是三个运算符的代号),意思就是abcd的从左到右顺序不乱,m1m2m3从左到右的顺序也不会乱,⽐较粗暴的理解就是ab之间⼀定是m1,bc之间⼀定是m2,cd之间⼀定其实m3,然后如果成功返回运算的过程和true,否则返回false1bool cal1(double a, double b, double c, double d, int m1, int m2, int m3)2 {3double r1;4double r2;5double r3;6 r1 = cal(a, m1, b);7 r2 = cal(r1, m2, c);8 r3 = cal(r2, m3, d);9if (r3 == 24)10 {11 cout << "(((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << ")" << endl;12return1;13 }14return0;15 }//第⼀种r1=a$b,r2=r1$c,r3=r2$d;1617bool cal2(int a, int b, int c, int d, int m1, int m2, int m3)18 {19double r1;20double r2;21double r3;22 r1 = cal(b, m1, c);23 r2 = cal(a, m2, r1);24 r3 = cal(r2, m3, d);25if (r3 == 24)26 {27 cout << "((" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << c << "))" << mark_char[m3 - 1] << d << ")" << endl;28return1;29 }30return0;31 }//第⼆种r1=b$c,r2=a$r1,r3=r2$d;33bool cal3(int a, int b, int c, int d, int m1, int m2, int m3)34 {35double r1;36double r2;37double r3;38 r1 = cal(b, m1, c);39 r2 = cal(r1, m2, d);40 r3 = cal(a, m3, r2);41if (r3 == 24)42 {43 cout << "(" << a << mark_char[m1 - 1] << "((" << b << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << "))" << endl;44return1;45 }46return0;47 }//第三种r1=b$c,r2=r1$d,r3=a$r2;4849bool cal4(int a, int b, int c, int d, int m1, int m2, int m3)50 {51double r1;52double r2;53double r3;54 r1 = cal(c, m1, d);55 r2 = cal(b, m2, r1);56 r3 = cal(a, m3, r2);57if (r3 == 24)58 {59 cout << "(" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << ")))" << endl;60return1;61 }62return0;63 }//第四种r1=c$d,r2=b$r1,r3=a$r2;6465bool cal5(int a, int b, int c, int d, int m1, int m2, int m3)66 {67double r1;68double r2;69double r3;70 r1 = cal(a, m1, b);71 r2 = cal(c, m3, d);72 r3 = cal(r1, m2, r2);73if (r3 == 24)74 {75 cout << "((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << "))" << endl;76return1;77 }78return0;79 }//第五种r1=a$b,r2=c$d,r3=r1$r2;接下来是12种的符号的排列情况,如果有⼀种括号情况满⾜,我们就返回true,否则返回false1bool all_cal(int a, int b, int c, int d)2 {3for (int i = 1; i <= 4; i++)4for (int j = 1; j <= 4; j++)5for (int k = 1; k <= 4; k++)6 {7if (cal1(a, b, c, d, i, j, k) == true || cal2(a, b, c, d, i, j, k) == true || cal3(a, b, c, d, i, j, k) == true || cal4(a, b, c, d, i, j, k) == true || cal5(a, b, c, d, i, j, k) == true) 8return1;9 }10return0;11 }最后是在总判断函数中写⼊24种的abcd排列情况1bool judge(int a, int b, int c, int d)2 {3int all[24][4] = {4 {a,b,c,d},{a,b,d,c},{a,c,b,d},{a,c,d,b},{a,d,b,c},{a,d,c,b},5 {b,a,c,d},{b,a,d,c},{b,c,a,d},{b,c,d,a},{b,d,a,c},{b,d,c,a},6 {c,a,b,d},{c,a,d,b},{c,b,a,d},{c,b,d,a},{c,d,a,b},{c,d,b,a},7 {d,a,b,d},{d,a,d,b},{d,b,a,c},{d,b,c,a},{d,c,a,b},{d,c,b,a},8 };9for (int i = 0; i < 24; i++)10 {11if (all_cal(all[i][0], all[i][1], all[i][2], all[i][3]))12return1;13 }14return0;15 }主函数调⽤judge就完成整个算法了✿✿ヽ(°▽°)ノ✿1int main()4 cin >> a >> b >> c >> d;5if (!judge(a, b, c, d))6 cout << "凑不成24点" << endl;78 }失败的话会显⽰“凑不成24点”其实这个算法的话我写的可以说基本没有优化,就是枚举所有情况实现的,csdn上有⼤佬是有更好的思路的,这篇⽂章也是看了csdn的⼤佬的代码然后⾃⼰修修补补写出来的(我原来看的那篇有bug,⼤佬⾃⼰没发现好像。

用C语言实现24点的算法程序

用C语言实现24点的算法程序

//#include "stdafx.h"# include <stdio.h>#include "conio.h"#include "stdlib.h"#include "time.h"#include "math.h"#include "string.h"#include "iostream.h"/*从一副扑克牌中,任取4张。

2-10 按其点数计算(为了表示方便10用T表示),J,Q,K,A 统一按1 计算要求通过加减乘除四则运算得到数字24。

本程序可以随机抽取纸牌,并用试探法求解。

*/int s[21][4]={-1};int sum=0;void GivePuzzle(char* buf){char card[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};for(int i=0; i<4; i++){buf[i] = card[rand() % 13];}}void SetPuzzle(char *buf){scanf("%c %c %c %c",&buf[0],&buf[1],&buf[2],&buf[3]);}void shuffle(char * buf){for(int i=0; i<5; i++){int k = rand() % 4;char t = buf[k];buf[k] = buf[0];buf[0] = t;}}int GetCardValue(int c){if(c=='T') return 10;if(c>='0' && c<='9') return c - '0';return 1;}char GetOper(int n){switch(n){case 0:return '+';case 1:return '-';case 2:return '*';case 3:return '/';}return ' ';}double MyCalcu(double op1, double op2, int oper){switch(oper){case 0:return op1 + op2;case 1:return op1 - op2;case 2:return op1 * op2;case 3:if(fabs(op2)>0.0001)return op1 / op2;elsereturn 100000;}return 0;}void MakeAnswer(char* answer, int type, char* question, int* oper){char p[4][3];for(int i=0; i<4; i++){if( question[i] == 'T' )strcpy(p[i], "10");elsesprintf(p[i], "%c", question[i]);}switch(type){case 0:sprintf(answer, "%s %c (%s %c (%s %c %s))",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 1:sprintf(answer, "%s %c ((%s %c %s) %c %s)",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 2:sprintf(answer, "(%s %c %s) %c (%s %c %s)",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 3:sprintf(answer, "((%s %c %s) %c %s) %c %s",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 4:sprintf(answer, "(%s %c (%s %c %s)) %c %s",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;}}bool TestResolve(char* question, int* oper, char* answer){// 等待考生完成int type[5]={0,1,2,3,4};//计算类型double p[4];double sum=0;for(int i=0; i<4; i++) //循环取得点数{p[i]=GetCardValue(int(question[i]));}for(i=0;i<5;i++){MakeAnswer(answer,type[i],question,oper); //获取可能的答案//printf("Doing:%s\n", answer);switch(type[i]){case 0:sum=MyCalcu(p[0],MyCalcu( p[1],MyCalcu(p[2], p[3], oper[2]),oper[1]),oper[0]); //A*(B*(c*D))break;case 1:sum=MyCalcu(p[0],MyCalcu(MyCalcu(p[1], p[2], oper[1]),p[3],oper[2]),oper[0]); //A*((B*C)*D)break;case 2:sum=MyCalcu(MyCalcu(p[0], p[1], oper[0]),MyCalcu(p[2], p[3], oper[2]),oper[1]); // (A*B)*(C*D)break;case 3:sum=MyCalcu(MyCalcu(MyCalcu(p[0], p[1], oper[0]),p[2],oper[1]),p[3],oper[2]); //((A*B)*C)*Dbreak;case 4:sum=MyCalcu(MyCalcu(p[0],MyCalcu(p[1], p[2], oper[1]),oper[0]),p[3],oper[2]); //(A*(B*C))*Dbreak;}if(sum==24) return true;}return false;}bool permNum(int* oper, int i,int N,char*question,char*answer) //递归实现重新排列数字、运算符{int j, k;char tmp;if(i < N){for(j = i; j < N; j++){tmp = question[j];for(k = j; k > i; k--)question[k] = question[k-1];question[i] = tmp;if( permNum(oper, i+1,N,question,answer)) return true;for(k = i; k < j; k++)question[k] = question[k+1];question[j] = tmp;}}else{//int type;if( TestResolve(question, oper, answer) ){//getch();return true;}}return false;}bool perm(int* num, int i,int N,char*question,char*answer) //递归实现重新排列数字、运算符{int j, k, tmp;if(i < N){for(j = i; j < N; j++){tmp = num[j];for(k = j; k > i; k--)num[k] = num[k-1];num[i] = tmp;if(perm(num, i+1,N,question,answer)) return true;for(k = i; k < j; k++)num[k] = num[k+1];num[j] = tmp;}}else{if (permNum(num,0,4,question,answer)) return true;}return false;}int ifcan(int str[4]){for(int i=0;i<sum;i++){if(s[i][0]==str[0]&&s[i][1]==str[1]&&s[i][2]==str[2]) {return 1;}}s[i-1][0]=str[0];s[i-1][1]=str[1];s[i-1][2]=str[2];sum++;return 0;}bool Chooseoper(int *oper,char*question,char*answer) //递归从四个运算符获取三个运算符{int n=3,m=12,i,j;int oper1[12];for (i=0;i<n;i++){oper1[i]=i;}for (i=0;i<n;i++){oper[i]=oper1[i]/3;}if (!ifcan(oper)){if(perm(oper,0,n,question,answer)) return true;}j=n-1;while (1){if (oper1[n-1]==m-1)j--;else j=n-1;oper1[j]++;for (i=j+1;i<n;i++)oper1[i]=oper1[i-1]+1;for (i=0;i<n;i++){oper[i]=oper1[i]/3;}if (!ifcan(oper)){if(perm(oper,0,n,question,answer)) return true;}if (oper1[0]>=m-n)break;}return false;}bool Try(int *oper,char*question,char* answer){if(Chooseoper(oper,question,answer)) return true;return false;}int main(int argc, char* argv[]){// 初始化随机种子srand( (unsigned)time( NULL ) );char buf1[4]; // 题目char buf2[30]; // 解答printf("***************************\n");printf("计算24\n");printf("A J Q K 均按1计算,其它按牌点计算,T 代表10\n");printf("目标是:通过四则运算组合出结果:24\n");printf("Mode 1 of Give Puzzle: Rand to give puzzle\n");printf("Else Type of Give Puzzle:Give by Youself \n");printf("***************************\n\n");int mode=1; //默认为1printf("Mode:");scanf("%d",&mode);getchar();printf("***************************\n");for(;;){if (mode==1){GivePuzzle(buf1); // 出题模式1}else{printf("Num:");SetPuzzle(buf1); //出题模式2}getchar();printf("题目:");for(int j=0; j<4; j++){if( buf1[j] == 'T' )printf("10 ");elseprintf("%c ", buf1[j]);}printf("\n按任意键参考答案...\n");getch();int type[4];if( Try(type, buf1,buf2) ) //1全局搜索解法,精确解printf("参考:%s\n", buf2);elseprintf("无解...\n");for (int i=0;i<sum;i++){for(int j=0;j<3;j++)s[i][j]=-1;}sum=0;printf("按任意键出下一题目,x 键退出...\n");if( getch() == 'x' ) break;}return 0;}。

24点程序C#代码(随机方法实现)

24点程序C#代码(随机方法实现)
{
label1.Content = ra.Next(1, 14);
label2.Content = ra.Next(1, 14);
label3.Content = ra.Next(1, 14);
label4.Content = ra.Next(1, 14);
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
double s3 = s1.ran(result5, result6, math2); //s3为抽两个数随机运算,r7没用
double s4 = s1.ran(s3, result7, math3); //s4为最终结果
label5.Content = "";
}
private void button2_Click(object sender, RoutedEventArgs e)
{
yunsuan s1 = new yunsuan(); //s1为运算对象
do { random1 = ra.Next(0, 4); }
while (random1 ==random );
result2 =array [random1 ];
}
for (int i = 0; i < 100000; i++)
{
int math1 = ra.Next(1, 5); //math1为随机运算符1

24点游戏C语言代码及报告

24点游戏C语言代码及报告

24点游戏一,问题分析二十四点游戏规则:给出4个数字,所给数字均为有理数,用加、减、乘、除(可加括号)把给出的数算成24.每个数必须用一次且只能用一次,先算出结果者获胜。

步骤:比如下面的例子:例:3、8、8、9,答案1:(9—8)×8×3答案2:3×8 ÷(9—8)答案3:(9—8÷8)×3利用3×8=24、4×6=24求解我的主要想法是首先穷举的可行性问题。

我把表达式如下分成三类——1、无括号的简单表达式。

2、有一个括号的简单表达式。

3、有两个括号的较复4、杂表达式。

穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。

我利用一个嵌套函数实现四个数的排列二,源程序及注释//首先穷举的可行性问题。

我把表达式如下分成三类——//1、无括号的简单表达式。

//2、有一个括号的简单表达式。

//3、有两个括号的较复4、杂表达式。

//穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。

我利用一个嵌套函数实现四个数的排列#include <iostream>#include <string>using namespace std;int number=0;string sss[5000];float cal(float a,float b,int p){switch(p){case 1:return a+b;case 2:return a-b;case 3:return a*b;case 4:return a/b;case 5:return b-a;case 6:return b/a;}}string link(string a,string b,int p){string st=a;switch(p){case 1:st+=("+"+b);break; case 2:st+=("-"+b);break; case 3:st+=("*"+b);break; case 4:st+=("/"+b);break; case 5:st=b+"-"+st;break; case 6:st=b+"/"+st;break; }st="("+st+")";return st;}void putout1(string c[],int p[]){string st;st=link(c[1],c[2],p[1]);st=link(st,c[3],p[2]);st=link(st,c[4],p[3]);st=st.erase(0,1);st=st.erase(st.length()-1,1);number++;sss[number]=st;}void putout2(string c[],int p[]){string st1,st2,st;st1=link(c[1],c[2],p[1]);st2=link(c[3],c[4],p[3]);st=link(st1,st2,p[2]);st=st.erase(0,1);st=st.erase(st.length()-1,1);number++;sss[number]=st;}void suan(float a[],string c[])int p[4];int i;float sum,sum1,sum2;for(p[1]=1;p[1]<=6;p[1]++)for(p[2]=1;p[2]<=6;p[2]++)for(p[3]=1;p[3]<=6;p[3]++){sum=cal(a[1],a[2],p[1]);sum=cal(sum,a[3],p[2]);sum=cal(sum,a[4],p[3]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout1(c,p); sum1=cal(a[1],a[2],p[1]);sum2=cal(a[3],a[4],p[3]);sum=cal(sum1,sum2,p[2]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout2(c,p); }}void disorder(float a[],string c[]){float b[5];string d[5];int i,j,k,l;for(i=1;i<=4;i++)for(j=1;j<=4;j++){if(j==i)continue;for(k=1;k<=4;k++){if(k==i||k==j)continue;for(l=1;l<=4;l++){if(l==i||l==j||l==k)continue;b[1]=a[i];b[2]=a[j];b[3]=a[k];b[4]=a[l];d[1]=c[i];d[2]=c[j];d[3]=c[k];d[4]=c[l];suan(b,d);}}}}int main()cout<<"请输入四个数字";float a[5];int i,j;string c[5];for(i=1;i<=4;i++){cin>>a[i];if(a[i]==10)c[i]="10" ;else c[i]=int(a[i])+'0';}disorder(a,c);int v=1,u=0;for(i=1;i<=number;i++){v=1;for(j=1;j<i;j++)if(sss[i]==sss[j])v=0;if(v==1){cout<<sss[i]<<endl;u=1;}}if(u==0)cout<<"无解"<<endl;system("pause");return 0;}三,运行结果显示四,调试和运行程序过程中产生的问题及采取的措施:。

24点算法 c#源码

24点算法 c#源码
Console.Write(expression[0] + "\t\t");
Judgement = true;
count++;
if ((count % 3) == 0)
number[i] = b - a;
Search(n - 1);
expression[i] = '(' + expa + '*' + expb + ')'; //乘法不需要分顺序
/// 核心运算方法
/// </summary>
/// <param name="n">****</param>
static void Search(int n)
{
if (n == 1)//n为1则说明算完了
{
//这里的n就是参与运算的次数 默认就是4 递归后 是3 2 1
//但是当n等于1时 2层循环中的j循环跑不起来 所以就是运行了三次
for (int j = i + 1; j < n; j++)
/// </summary>
static int NUMBER_TO_BE_CAL = 24;
#endregion
/// <summary>
/// 参与运算的数的数组
/// </summary>
if (i > 0)
{
i--;
}
else
{
number[i] = int.Parse(Console.ReadLine().Trim());

C语言实现24点问题详解

C语言实现24点问题详解

C语⾔实现24点问题详解⽬录题⽬描述问题分析代码实现运⾏结果题⽬描述在屏幕上输⼊1〜10范围内的4个整数(可以有重复),对它们进⾏加、减、乘、除四则运算后(可以任意的加括号限定计算的优先级),寻找计算结果等于24的表达式。

例如输⼊4个整数4、5、6、7,可得到表达式:4*((5-6)+7)=24。

这只是⼀个解,要求输出全部的解。

要求表达式中数字的顺序不能改变。

问题分析这道题理解起来很简单,就是拼凑加减乘除,使4个数的运算结果等于24。

由于四则运算中,乘除的优先级⾼于加减,所以必须“加括号”来限定4个数之间运算优先级。

例如:A+B*C-D 这个式⼦,通过增加括号,可以产⽣多种结果,⽐如 (A+B)*(C-D) 和 A+(B*C-D)。

那么总共有⼏种加括号的⽅法呢,该如何分类呢?⼀开始我在想是不是能按照括号对数进⾏分类,但后来发现,要想将4个数字的运算优先级细分,必须使⽤两对括号。

可以这么理解:我们的⽬的是将4个数的运算转换成两个“数”的运算(这⾥的“数”包括括号表达式),⽽每两个数运算,就能得出⼀个结果,即每对括号可以减少⼀个要计算的数字(如(A+B)*(C+D)中,A和B运算,使式⼦变成了3个数,C接着和D运算,使式⼦剩下两个数字)。

4-2=2即为需要的括号数。

下⾯列举所有可能的括号表达式:(#表⽰四则运算符)1. ((A#B)#C)#D2. (A#(B#C))#D3. A#((B#C)#D)4. A#(B#(C#D))5. (A#B)#(C#D)具体思路:上⾯5种括号表达式都可以单独写成函数,函数内部按照括号的优先级+从左往右的顺序进⾏运算,最后返回计算结果。

每个表达式中有3个'#'号,它们是四则运算符(+、-、*、/),可以定义⼀个全局字符数组,存放4这四个字符。

char my_oprator[4] = {'+', '-', '*', '/'};主函数使⽤穷举法,对表达式的每个#符号进⾏遍历(4种运算符),使⽤3层 for循环实现(层数对应3个#符号,每层循环4次,对应4种运算符),最后将符合条件的表达式输出。

C语言版24点游戏

C语言版24点游戏

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<time.h>#include<windows.h>struct s_node{int date;struct s_node *next;};typedef struct s_node s_list;typedef s_list *link;link OPER=NULL;link OPND=NULL;char m;link creat(link stack) //创建空栈的函数{stack=(link)malloc(sizeof(s_list));if (!stack){printf("\nERROR");return NULL;}return stack;}link push(link stack,int value) //添加新的元素value为stack的栈顶元素{link newnode;newnode=(link)malloc(sizeof(s_list));if (!newnode){printf("\nERROR");return NULL;}newnode->date=value;newnode->next=stack;stack=newnode;return stack;}link pop(link stack) //栈顶出栈的函数,m表示出栈的栈顶元素{link top;if (stack!=NULL){top=stack;stack=stack->next;m=top->date;free(top);return stack;}elsem=-1;}int is_oper(char oper) //判断是否为算符的函数{switch (oper){case'+':case'-':case'*':case'/':case'(':case')':case'#':return 1;default:return 0;}}int compare(char q1,char q2) //比较算符优先程度的函数{if (q1=='+') //‘+’的比较{switch (q2){case '+':return 1;case '-':return 1;return 0;case '/':return 0;case '(':return 0;case ')':return 1;case '#':return 1;}}else if (q1=='-') //‘-’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 0;case '/':return 0;case '(':return 0;case ')':return 1;case '#':return 1;}}else if (q1=='*') //‘*’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 1;case '/':return 1;return 0;case ')':return 1;case '#':return 1;}}else if (q1=='/') //‘/’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 1;case '/':return 1;case '(':return 0;case ')':return 1;case '#':return 1;}}else if (q1=='(') //‘(’的比较{switch (q2){case '+':return 0;case '-':return 0;case '*':return 0;case '/':return 0;case '(':return 0;case ')':return 2;return -1;}}else if (q1==')') //‘)’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 1;case '/':return 1;case '(':return -1;case ')':return 1;case '#':return 1;}}else if (q1=='#') //‘#’的比较{switch (q2){case '+':return 0;case '-':return 0;case '*':return 0;case '/':return 0;case '(':return 0;case ')':return -1;case '#':return 2;}}}int operate(int p1,int p2,char q) //二元运算的函数,q代表运算符,p1为运算符的左边数值,p2为运算符的右边数值{int p;if (q=='+'){p=p1+p2;return p;}else if (q=='-'){p=p1-p2;return p;}else if (q=='*'){p=p1*p2;return p;}else if (q=='/'){p=p1/p2;return p;}}int main(){char c,e,u;int n,a,b,t,v;int i=0;int f1,f2,f3,f4,flag=0;int h[5]={0};OPER=creat(OPER);OPND=creat(OPND);while (1){OPER->date=0;OPND->date=0;printf("------------------------------------------------------------------------------\n\n\n");printf(" 24点游戏系统\n\n");printf(" 您得到的四个随机数\n\n");srand( (unsigned)time( NULL ) );f1=rand()%13+1;f2=rand()%13+1;f3=rand()%13+1;f4=rand()%13+1;printf(" 【%d】【%d】【%d】【%d】\n\n",f1,f2,f3,f4);printf(" 请输入表达式'#'号结束,无法解答请输入? 直接结束请输入* \n\n");printf("------------------------------------------------------------------------------\n\n\n");printf(" ");c=getchar();if (c=='?'){system("cls");getchar();continue;}else if (c=='*')break;while (OPER->date!='#'){if (flag==1)break;if (is_oper(c)){if (OPER->date==0) //判断OPER是否为空{OPER=push(OPER,c); //若为空则为第一次输入,进栈.c=getchar();continue;}else{n=compare(OPER->date,c);switch (n){case 0:{OPER=push(OPER,c);c=getchar();break;}case 1:{OPER=pop(OPER);e=m;OPND=pop(OPND);if((t!=f1)&&(t!=f2)&&(t!=f3)&&(t!=f4)&&(t!=h[0])&&(t!=h[1])&&(t!=h[2])&&(t!=h[3])&&(t!=h[4])& &(t!=h[5])){printf("\n\n-----------------------------没有使用给出的数字!-------------------------------\n\n");flag=1;}b=m;OPND=pop(OPND);if((t!=f1)&&(t!=f2)&&(t!=f3)&&(t!=f4)&&(t!=h[0])&&(t!=h[1])&&(t!=h[2])&&(t!=h[3])&&(t!=h[4])& &(t!=h[5])){printf("\n\n-----------------------------没有使用给出的数字!-------------------------------\n\n");flag=1;}a=m;t=operate(a,b,e);h[i]=t;i++;OPND=push(OPND,t);break;}case 2:{OPER=pop(OPER);c=getchar();break;}}}}else{OPND=push(OPND,c-48);c=getchar();if (is_oper(c))continue;else{OPND=pop(OPND);v=c-'0';t=m*10+v;if((t!=f1)&&(t!=f2)&&(t!=f3)&&(t!=f4)&&(t!=h[0])&&(t!=h[1])&&(t!=h[2])&&(t!=h[3])&&(t!=h[4])& &(t!=h[5])){printf("\n\n-----------------------------没有使用给出的数字!-------------------------------\n\n");flag=1;}OPND=push(OPND,t);h[i]=t;i++;c=getchar();continue;}}}if (OPND->date==24&&flag==0){printf("----------------------------------------------------------------------------\n\n\n");printf(" **【Congratulation!】** \n\n\n");printf("----------------------------------------------------------------------------\n\n\n");}else if (flag==0){printf("----------------------------------------------------------------------------\n\n\n");printf(" **【Incorrect!】** \n\n\n");printf("----------------------------------------------------------------------------\n\n\n");}system("pause");printf(" 是否继续游戏?y:继续.n:结束\n\n\n");flag=0;u=getchar();if (u=='n'){break;}else{c=getchar();system("cls");continue;}}printf("\n\n\n-----------------------------24点游戏系统-------------------------------\n\n\n");printf("\n\n\n **谢谢使用!**\n");system("pause");return 0;}。

c++巧算24点代码

c++巧算24点代码

#include<iostream.h>#include <ctime>#include <cstdlib>int jjcc(int a,int b,char sig);int calExpress(int a,int b,int c,int d);char sig[4]={'+','-','*','/'};bool flag=true;int num=0;void main(){char t;int a,b,c,d,s[4],i,j,k,m;clock_t t1=clock(); //产生随机数cout<<"计算24点的四个数为";srand((unsigned)time(NULL));a=rand()%13+1;b=rand()%13+1;c=rand()%13+1;d=rand()%13+1;cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;cout<<"需要帮助吗?(y/n)"<<endl;if((t=cin.get())=='y'){s[0]=a;s[1]=b;s[2]=c;s[3]=d;for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)for(m=0;m<4;m++)if(i!=j && i!=k && i!=m && j!= k && j!=m && k!=m)if(calExpress(s[i],s[j],s[k],s[m]) ==1)return;if (num==0) cout << "no answer" << endl;}}int jjcc(int a,int b,char sig) //计算两个数的加减乘除的结并返回{switch(sig){case'+':return a+b;case'-':return a-b;case'*':return a*b;case'/':if(a%b!=0) flag=false;return a/b;}}int calExpress(int a, int b, int c, int d) //寻找满足结果为24的式子{int temp1,temp2,temp3;for(int i=0;i<4;i++){for(int j=0;j<4;j++){for(int k=0;k<4;k++){flag=true;if(i<=1){if(j<=1){temp1=jjcc(c,d,sig[k]);temp2=jjcc(a,b,sig[i]);temp3=jjcc(temp1,temp2,sig[j]);if(temp3==24&&flag==true){num++;cout<<a<<sig[i]<<b<<sig[j]<<c<<sig[k]<<d<<"=24"<<endl;return 1;}}else{temp1=jjcc(b,c,sig[j]);temp2=jjcc(temp1,d,sig[k]);temp3=jjcc(a,temp2,sig[i]);if(temp3==24&&flag==true){cout<<a<<sig[i]<<b<<sig[j]<<c<<sig[k]<<d<<"=24"<<endl;num++;return 1;}}}else{temp1=jjcc(a,b,sig[i]);if(j<=1){temp2=jjcc(c,d,sig[k]);temp3 = jjcc(temp1,temp2,sig[j]);if(temp3 == 24&& flag == true){num++;cout << a << sig[i] << b << sig[j] <<c << sig[k] << d << " = 24"<< endl;return 1;}}else{temp2 = jjcc(temp1, c, sig[j]);temp3 = jjcc(temp2, d, sig[k]);if(temp3 == 24&& flag == true){num++;cout << a << sig[i] << b << sig[j] <<c << sig[k] << d << " = 24"<< endl;return 1;}}}}}}return 0;}。

C语言计算24点(原创完美版)

C语言计算24点(原创完美版)

#include<stdio.h>char cha[4]="+-*/",c=0;float fun(float a1,float a2,int b){switch(b) //选择四则运算{case 0:return (a1+a2);case 1:return (a1-a2);case 2:return (a1*a2);case 3:return (a1/a2);}}void algebra(int x[4])//计算满足要求的表达式{int i,j,k;float temp1,temp2,temp3;for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++){temp1=fun(x[0],x[1],i);temp2=fun(temp1,x[2],j);temp3=fun(temp2,x[3],k);if(temp3==24){printf("\t\t\t\t[(%d%c%d)%c%d]%c%d=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[0],x[1],i);temp2=fun(x[2],x[3],k);temp3=fun(temp1,temp2,j);if(temp3==24){printf("\t\t\t\t(%d%c%d)%c(%d%c%d)=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[1],x[2],j);temp2=fun(temp1,x[0],i);temp3=fun(temp2,x[3],k);if(temp3==24){printf("\t\t\t\t[%d%c(%d%c%d)]%c%d=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[1],x[2],j);temp2=fun(temp1,x[3],k);temp3=fun(temp2,x[0],i);if(temp3==24){printf("\t\t\t\t%d%c[(%d%c%d)%c%d]=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[2],x[3],k);temp2=fun(temp1,x[1],j);temp3=fun(temp2,x[0],i);if(temp3==24){printf("\t\t\t\t%d%c[%d%c(%d%c%d)]=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}}}int arrange(int num[4])//将四个数排列为24种方式{int i,j,k,l;int temp[4];for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)for(l=0;l<4;l++){if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l){temp[0]=num [i];temp[1]=num[j];temp[2]=num[k];temp[3]=num[l];algebra(temp);}}}int main(){int i, num[4];char ch;printf(" **计算24点游戏**\n\n请输入4个整数,然后按“回车”键: \n");for(i=0;i<4;i++)scanf("%d",&num[i]);//将四个数输入到数组中去printf("结果是:\n");arrange(num);if(c==0)printf("无解.\n");printf("是否继续?(y,n): ");fflush(stdin);ch=getchar();fflush(stdin);if(ch=='n'){printf("\t\t\t\t ****再见!****\n\n");return 0;}while(ch!='y'){printf("输入错误,请重输(y或n): ");ch=getchar();fflush(stdin);if(ch=='n')return 0;}while(ch=='y'){printf("请输入四个整数:");for(i=0;i<4;i++)scanf("%d",&num[i]);//将四个数输入到数组中去fflush(stdin);printf("结果是:\n");arrange(num);if(c==0)printf("无解.\n");printf("是否继续?(y,n): ");ch=getchar();fflush(stdin);if(ch=='n'){printf("\t\t\t\t ******再见!****\n\n");return 0;}while(ch!='y'){printf("输入错误,请重输(y或n): ");ch=getchar();fflush(stdin);if(ch=='n'){printf("\t\t\t\t ******再见!****\n\n");return 0;} }}return 0;}。

数据结构课程设计+24点游戏源代码

数据结构课程设计+24点游戏源代码

课程设计课程设计名称:数据结构课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:计算机科学与技术专业课程设计任务书1.需求分析24点游戏主要有两个功能:(1)用户记算24点程序随机产生四个1-13的数,分别代表4张牌, 提示用户输入算式。

如果用户认为程序给出的一组数字不能算出24点(如1,1,2,2),则输入‘?’,然后程序对这四个数字进行计算,如果真的不能算出24点,则输出用户正确的信息,否则给出一个正确的算式,并显示用户错误的信息。

(2).程序计算24点用户输入四个1-13的数,代表4张牌,程序需要通过一定的规则添加括号和运算符来使算式的值等于24,如果用户给出的四个数字不能算出24点,则输出错误信息!2.概要设计○1抽象数据结构定义:ADT{数据对象:D={a|a为大于0小于14的整数}push(sqstack *s,int e) //压栈gettop(sqstack *s) //取得栈顶元素pop(sqstack *s,int *e) //出栈randomm() //产生四个随机数EvaluateExpression(char* MyExpression)//课本算法3.4---计算表达式的值init_sq(sqlist *l) //初始化链表insert_sq(sqlist **p,int e,int bl) //链表插入操作chang(char *s,sqlist *l) //将用户的输入转化为单链表check(sqlist l) //保证输入的数字是给出的四个数字Operate(int a,int theta, int b) //计算precede(char Aop, char Bop) //求运算符优先级ReturnOpOrd(char op,char* TestOp) //返回运算符优先级CalcOneExpress(int expression[][2])//课本算法3.4--计算表达式的值Calc24(int number[2][4])//包含下面五个函数,即表达式的五种形式CalcArray1(int iNumInput[2][4])// a * b * c * d //7 个字符CalcArray2(int iNumInput[2][4])// (a * b) * c * d //9 numberCalcArray3(int iNumInput[2][4])// (a * b * c) * d //9 numberCalcArray4(int iNumInput[2][4])// (a * b) * (c * d) //11 numbersCalcArray5(int iNumInput[2][4])// ((a * b) * c) * d //11 numbersEqual24(int n) //判定结果是否等于24gameinformation() //游戏介绍menu() //菜单main() //主函数}ADT○2模块划分3 运行环境硬件环境:PC机软件环境:Windows XPMicrosoft Visual C++ 6.04 开发工具和编程语言开发工具:Microsoft Visual C++ 6.0 编程语言:C语言5 详细设计(1)全局变量和栈,链表的定义int number[2][4];enum{eNumber = 0,//操作数eOperator = 1//算子};int oper[7]={43,45,42,47,40,41,35};课本表3.1 算符间的优先关系:unsigned char Prior[7][7] = {'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};线性表的定义:typedef struct sqlist{int bol; //bol是0时,num-ch是数字;bol是1时num_ch是运算符int num_ch;struct sqlist *next;}sqlist;栈的定义:typedef struct sqstack{int *base;int *top;int stacksize;}sqstack;(2)main()函数及用户界面void main(){gameinformation(); //输出作者信息menu(); //输出功能菜单,游戏开始}用户界面如图1 所示。

24点游戏(C#)

24点游戏(C#)

24点游戏(C#)游戏描述:输入参数:4个0…9之间的数字(顺序可调)计算方法:加减乘除(括号)计算结果:24程序截图:程序描述:程序的三种模式:1,全部组合(有解):将有解的组合全部列出(因为数据组合较多,一屏可能显示不下,所以分段显示)。

如下图(第一段):2,全部组合(无解含):将所有的组合一一列出,包括无解的组合(同模式一,分屏显示)。

如下图(第一段):3,手动输入(默认):手动输入4个数字,程序自动计算,得出结果。

如下图:程序代码用VS创建ConsoleApplication程序,拷贝一下代码覆盖原代码即可。

(有任何问题,可以私密我)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace Game24{public class Program{///<summary>///計算結果String///</summary>private static Stack<string> stackResult = new Stack<string>();///<summary>///起動方法///</summary>///<param name="args"></param>public static void Main(string[] args){bool reFlg = true;int[] aryInput = new int[4];Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("===================24点Game===================");Console.WriteLine("========================================tpj");while (reFlg){Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine(" 1:全部組合(有解)");Console.WriteLine(" 2:全部組合(無解含)");Console.WriteLine(" 3:手動輸入(默認)");Console.WriteLine(" 4:中止");Console.Write("選択:");string select = Console.ReadLine();#region全部組合if (select == "1" || select == "2"){int mukaisu = 0;int youkaisu = 0;int current = 0;for (int i = 0; i < 10; i++){for (int j = i; j < 10; j++){for (int k = j; k < 10; k++){for (int d = k; d < 10; d++){current++;aryInput[0] = i;aryInput[1] = j;aryInput[2] = k;aryInput[3] = d;bool isRight = Keisan(aryInput);if (select == "1"){if (isRight){youkaisu++;Console.ForegroundColor = ConsoleColor.Gray;Console.Write(string.Format("{0}:{1}、{2}、{3}、{4} ", youkaisu, aryInput[0], aryInput[1], aryInput[2], aryInput[3]));Console.ForegroundColor = ConsoleColor.DarkYellow;string allResult =GetAllResult(stackResult.ToList());Console.WriteLine(allResult);}else{mukaisu++;}}else{if (isRight){youkaisu++;Console.ForegroundColor = ConsoleColor.Gray;Console.Write(string.Format("{0}:{1}、{2}、{3}、{4} ", youkaisu + mukaisu, aryInput[0], aryInput[1], aryInput[2], aryInput[3]));Console.ForegroundColor = ConsoleColor.DarkYellow;string allResult =GetAllResult(stackResult.ToList());Console.WriteLine(allResult);}else{mukaisu++;Console.ForegroundColor = ConsoleColor.Gray;Console.Write(string.Format("{0}:{1}、{2}、{3}、{4} ", youkaisu + mukaisu, aryInput[0], aryInput[1], aryInput[2], aryInput[3]));Console.ForegroundColor = ConsoleColor.DarkYellow;Console.WriteLine("無解...");}}if (current != 0 && current % 120 == 0){Console.ForegroundColor = ConsoleColor.Yellow;Console.Write(string.Format("({0},{1},{2},{3})⇒({4},{5},{6},{7})完了。

c语言程序 计算24点

c语言程序 计算24点

for (f2=0;f2<4;f2++)
for (f3=0;f3<4;f3++) // 运算符 f1,f2,f3
{
4 、 //----------- 未 用 循 环 , 直 接 穷 举 三 个 运 算 符 的 优 先 级 : 3!-1=5 种
( 3*2-1=5)-------------------
3、24 点计算。定义 double t1,t2,t3;
t1,t2,t3 用于存放计算的中间值,
两个两个地按优先级进行计算。
4、判断是否为 24。在运算过程中除法的特殊性——除数不能为零。因为可能会
用到除法,所以要考虑精度问题。这里通过结果减去 24 取绝对值与一个接近 0
的小数(如 0.001)比较,如小于它,即可判定结果是 24。
比较运算结果 是否等于 24

2、编程实现。
1、加减乘除运算
否 是否循环结束

结束
double {
}
cal(double a,double b,int op)
switch (op) { case 0: return(a+b); case 1: return(a-b); case 2: return(a*b); }
//i 表示 v[i]下标的位置 i1
i2 i3 i4 不能相等(分别为 0 1 2 3) 表示 4 个数排列在数组 4 个不同的位置

for (i2=0;i2<4;i2++)
// 四重循环对四个数穷举
if (i2!=i1)
for (i3=0;i3<4;i3++)
if (i3!=i2 && i3!=i1)

关于24点游戏的编程思路与基本算法

关于24点游戏的编程思路与基本算法

关于24点游戏的编程思路与基本算法24点游戏的算法,其中最主要的思想就是穷举法。

所谓穷举法就是列出4个数字加减乘除的各种可能性,包括括号的算法。

我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,其中算术符号有+,-,*,/,。

其中有效的表达式有a,ab-cd,等等。

列出所有有效的表达式。

其中我们用枚举类型将符号定义成数字常量,比如用1表示+,2表示-等。

如下是我对穷举法的一种编程语言。

在编程的头部要对变量做下定义。

其中a,b,c,d的范围是1到10。

这就需要在定义变量的时候要有限制。

在vc++中的编程中,在定义控件的变量范围可以直接填写变量的最大和最小,在此编程中的最大是10,最小是1。

这就给编程写语句带来了方便。

运用C/C++语言开发工具Microsoft Visual C++ 6.0,利用它简单、明了的开发特点对课本知识进行系统的实践,并且通过对各个知识点的运用进行所需的程序编写。

首先,要充分理解每个程序涉及的算法,牢记实现算法的每一个步骤;其次,再在计算机上利用C语言编写出代码,要求结构清晰,一目了然;最后,要对程序进行优化,使程序实现优秀的运行功能。

在编写程序的过程中要充分理解并能熟练使用对应的算法,竟可能多的涉及课本中的知识点。

总之通过实行整体方案,最终使程序达到运行状态,并且实现良好的运行效果。

故做了如下的计划安排,将这项工程分为两大部分:程序的设计和程序的调试。

首先在程序的设计部分由分为几个步骤:•第一步:查阅有关归并排序算法的资料。

•第二步:设计这个项目的整体架构和算法。

•第三步:选择一门程序设计语言进行算法的描述。

其次,进行程序的调试。

设计方法和内容在做某件事时,一个好的方法往往能起到事半功倍的效果。

在这个课程的设计上,我选择了C++语言作为算法的描述语言,因为C++语言具有丰富的表达能力以及代码的高效性,并且有着良好的移植性和灵活性。

同时,采用“自顶向下,个个击破”的程序设计思路和思想,充分运用C++语言强大的功能。

C++计算24点的简单程序

C++计算24点的简单程序

C++计算24点的简单程序本⽂实例为⼤家分享了C++计算24点的的具体代码,供⼤家参考,具体内容如下近来家庭作业⾥有24点的题⽬,为了找出所有可能的组合,就写了个简单的程序:1. 运⾏程序2. 输⼊4个整数,⽐如:3 3 7 83. 显⽰所有可能的组合代码:#include "assert.h"#include <iostream>double operate(double num1, double num2, int op){assert(op >= 0 && op < 4);if(op == 0){return num1 + num2;}else if(op == 1){return num1 - num2;}else if(op == 2){return num1 * num2;}else{return num1/num2;}}int calculate(int num1, int num2, int num3, int num4){char operators[] = "+-*/";for(int i = 0; i < 4; i ++){for(int j = 0; j < 4; j ++){for (int k = 0; k < 4; k ++){double ret = operate(num1, num2, i);ret = operate(ret, num3, j);ret = operate(ret, num4, k);if(abs(ret - 24) < 0.001){printf("((%d %c %d) %c %d) %c %d = %f\n", num1, operators[i],num2, operators[j],num3, operators[k],num4, ret);}ret = operate(num1, num2, i);double ret2 = operate(num3, num4, k);ret = operate(ret, ret2, j);if(abs(ret - 24) < 0.001){printf("(%d %c %d) %c (%d %c %d) = %f\n", num1, operators[i],num2, operators[j],num3, operators[k],num4, ret);}ret = operate(num2, num3, j);ret = operate(num1, ret, i);ret = operate(ret, num4, k);if(abs(ret - 24) < 0.001){printf("(%d %c (%d %c %d)) %c %d = %f\n", num1, operators[i],num2, operators[j],num3, operators[k],num4, ret);}ret = operate(num2, num3, j);ret = operate(ret, num4, k);ret = operate(num1, ret, i);if(abs(ret - 24) < 0.001){printf("%d %c ((%d %c %d) %c %d) = %f\n", num1, operators[i],num2, operators[j],num3, operators[k],num4, ret);}ret = operate(num3, num4, k);ret = operate(num2, ret, j);ret = operate(num1, ret, i);if(abs(ret - 24) < 0.001){printf("%d %c (%d %c (%d %c %d)) = %f\n", num1, operators[i],num2, operators[j],num3, operators[k],num4, ret);}}}}return 0;}int main(int argc, char* argv[]){int nums[4] = {0, 0, 0, 0};std::cin >> nums[0] >> nums[1] >> nums[2] >> nums[3];for (int i = 0; i < sizeof(nums)/sizeof(nums[0]); i ++){int num1 = nums[i];int ret = num1;for(int j = 0; j < sizeof(nums)/sizeof(nums[0]); j ++){if(j == i)continue;int num2 = nums[j];for(int k = 0; k < sizeof(nums)/sizeof(nums[0]); k++){if( k == i || k == j)continue;int num3 = nums[k];for(int l = 0; l < sizeof(nums)/sizeof(nums[0]); l ++){if(l == i || l == j || l == k)continue;int num4 = nums[l];calculate(num1, num2, num3, num4);}}}}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档