4个数计算24点

4个数计算24点

四个数的加减乘除

任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合(java版)

怎样实现一个计算24点的程序?

作者:赵冯平
链接:https://www.zhihu.com/question/431340356/answer/1591311227
来源:知乎

#include<iostream>
#include<cmath>
using namespace std;
double st1[100],st2[100];int p=0;
bool f24=0;
char op[100];
void pp(int n) {
	for(int i=0; i<n; i++)cout<<" ";
}
void prn(double a[],int n) {
	pp((4-n)*8);
	for(int i=0; i<n; i++)cout<<a[i]<<" ";
	cout<<endl;
}
void prints(){
	for(int i=0;i<p;i++)cout<<st1[i]<<' '<<op[i]<<' '<<st2[i]<<"       ";
	cout<<endl;
}
void d24(double a[],int n) {
//	prn(a,n);   调试时 观察每次递归调用
	if(n==1) {
		if(fabs(a[0]-24)<0.00000001){
			prints();
			f24=1;
		}else{
		}	
	} else {
		int i,j;
		for(i=0; i<n-1; i++) {
			for( j=i+1; j<n; j++) { //n个数整成n-1个数,
				//例入4个整成3个,任取2个,有6种取法,2个数进行+ - * / 有6种不同运算
				double ai,aj;
				ai=a[i],aj=a[j];
				a[i]=a[i]+a[j];
				a[j]=a[n-1];
				st1[p]=ai;st2[p]=aj;op[p]='+';p++;
				d24(a,n-1);
				p--;
				a[i]=ai;
				a[j]=aj;

				a[i]=ai-aj;
				a[j]=a[n-1];
				st1[p]=ai;st2[p]=aj;op[p]='-';p++;
				d24(a,n-1);
				p--;
				a[i]=ai;
				a[j]=aj;

				a[i]=a[i]*a[j];
				a[j]=a[n-1];
				st1[p]=ai;st2[p]=aj;op[p]='*';p++;
				d24(a,n-1);
				p--;
				a[i]=ai;
				a[j]=aj;
			
				a[i]=aj-ai;
				a[j]=a[n-1];
				st1[p]=aj;st2[p]=ai;op[p]='-';p++;
				d24(a,n-1);
				p--;
				a[i]=ai;
				a[j]=aj;

				if(aj!=0) {
					a[i]=ai/aj;
					a[j]=a[n-1];
					st1[p]=ai;st2[p]=aj;op[p]='/';p++;				
					d24(a,n-1);
					p--;
					a[i]=ai;
					a[j]=aj;
				}
				if(ai!=0) {
					a[i]=aj/ai;
					a[j]=a[n-1];
					st1[p]=aj;st2[p]=ai;op[p]='/';p++;			
					d24(a,n-1);
					p--;
					a[i]=ai;
					a[j]=aj;
				}
			}
		}
	}
}
int main() {
	double a[10];
	for(;;) {
        
		for(int i=0; i<4; i++)cin>>a[i];
		if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0) break;
		f24=0;
		d24(a,4);
		if(f24) cout<<"YES"<<endl ;
		else cout<<"NO"<<endl;
	}
	return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prejudices

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值