1□2□3□4□5□6□7□8□9=110

题目

1□2□3□4□5□6□7□8□9=110
要求在中间的8个空中填写+,-,或不填。构成的表达式判断是不是正确,正确则输出。。。。
(如果空格的中没有填写符号,则这几个数组成一个新的N位数,比如1□2,可以是1+2,也可以是12)

Code

#include<bits/stdc++.h>
using namespace std;

int n; //层次
int result = 0; //存储结果
int symbol[9] = {-1}; //记录符号(第一个不用,从 symbol[1]开始 
int a[10] = {1,2,3,4,5,6,7,8,9};//运算数 (第一个不用,从a[1]开始 
stack<int> data; //存储数据
stack<int> oper; //存储操作符

int calc(int n){
	if(n==9){
		while(!oper.empty()){
			int b = data.top();
			data.pop();
			
			int c = data.top();
			data.pop();
			
			int op = oper.top();
			oper.pop();
			
			if(op==1){
				data.push(c-b);
			}
			
			if(op==0){
				data.push(c+b);
			}
		}
		
		//最后结果,并输出 
		int result = data.top();
			if(result==110){
				cout<<'1';
				for(int i = 1;i<=8;++i){
					if(symbol[i]==0) cout<<"+";
					else if(symbol[i]==1) cout<<"-";
					cout<<a[i];
				}
				cout<<"=110"<<endl;
			}
			return 0;
	}
	
	//三种选择 
	for(int i = 0;i<3;++i){
		stack<int> oper_tmp = oper;
		stack<int> data_tmp = data;
		
		if(i==0){
			symbol[n] = 0;
			oper.push(symbol[n]);
			data.push(a[n]);
		}else if(i==1){
			symbol[n] = 1;
			oper.push(symbol[n]);
			data.push(a[n]);
		}else{
			symbol[n] = 2;
			int temp = data.top();
			data.pop();
			temp = temp*10 + a[n];
			data.push(temp); 
		}
		
		calc(n+1);
		oper = oper_tmp;//还原 
		data = data_tmp;
	}
} 

int main(){
	data.push(1);
	calc(1);
	return 0;
}

运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值