#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<string>
using namespace std;
int n=4;//三次运算标记值
int A[4]={0};//存储4个数字
char oper[4]={'+','-','*','/'}; //存储运算符
string B[4];
int count=0;
int F(int n){
//判断是否已完成三次运算
if(n==1){
if(A[0]==24)//判断结果是否为24
{
cout<<B[0]<<endl;//如果可以则输出,B[0]里蕴含了整个表达式
count++;
}
else
{}
}
//从数组中任意取出两个数的组合
for(int
i=0;i<n;i++){
for(int
j=i+1;j<n;j++){
double
a,b;
string
x,y;
a=A[i];
b=A[j];
A[j]=A[n-1];//将最后一位的赋给空出来的j
x=B[i];
y=B[j];
B[j]=B[n-1];//最后一位的数字放入第j个
A[i]=a+b;//第一个空间保存前两个的运算结果
B[i]='('+x+'+'+y+')';//将第一步的运算结果存入数组
F(n-1);
//减法应该分顺序
A[i]=a-b;
B[i]='('+x+'-'+y+')';
F(n-1);
A[i]=b-a;
B[i]='('+y+'-'+x+')';
F(n-1);
//乘法
A[i]=a*b;
B[i]='('+x+'*'+y+')';
F(n-1);
//除法也要分顺序, 并且判断分母不为零
if(b!=0){
A[i]=a/b;
B[i]='('+x+'/'+y+')';
F(n-1);
}
if(a!=0){
A[i]=b/a;
B[i]='('+y+'/'+x+')';
F(n-1);
}
//当以上四则运算的结果都不能满足条件时
//为了方便进入下一个for循环, 需要将之前的i和j上的值都重新找回
A[i]=a;
A[j]=b;
B[i]=x;
B[j]=y;
}
}
return 0;
}
/*
*对于每一个类,都可以在构造函数中构建一次随机数种子。
*这样,由于一个随机数种子会对应一个随机数。再由于时间在波动,所以,就可以更新随机数。
*同样可以增加代码的重用。可以说是一个非常好的程序员思维。
*/
class RandomNumber{
public:
RandomNumber(){
srand(time(0));
}
int get(int begin = 0, int end = 1){
return rand()%(end-begin+1)+begin;
}
};
int main(){
RandomNumber
r;
for (int i = 0; i < 4; ++i) {//生成4个1~13之间的数字
A[i]=r.get(1,13);
cout<<A[i]<<"
";
}
cout<<endl;
for(i=0;i<4;i++){
if(A[i]==1)
B[i]='A';
else
if(A[i]==11) B[i]='J';
else
if(A[i]==12) B[i]='Q';
else
if(A[i]==13) B[i]='K';
else
B[i]='0'+A[i];
}
F(n);
cout<<endl<<"总共有 "<<count<<" 种解法"<<endl;
return
0;
}
24点游戏
最新推荐文章于 2023-09-08 03:39:29 发布