求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)

思路

通过深搜直接暴力求解,本人只想到这种解法,如果有大佬有更好的解法欢迎评论。一共8个空每个空3中符号,共3^8=6561种情况。dfs显然足矣。

代码

// fileTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <fstream>
#include <vector>
#include <numeric>
#include <map>
#include <queue>
#include <string>
using namespace std;

vector<char> operate = { '*','+','-' };
vector<vector<char>> legal_operate;

// 思路2:将*替换成空字符,1+2*3*4-5+6*7*8*9-->1+234-5+6789进行字符串求值运算
//                       0 1
int calculate(const std::string& s) {
	int result = 0;
	int num = 0; // 用于存储当前解析的数字
	int sign = 1; // 1 表示加号,-1 表示减号
	for (char c : s) {
		if (isdigit(c)) {
			num = num * 10 + (c - '0'); // 将当前数字字符转换为整数,并加到num上
		}
		else {
			result += sign * num; // 在遇到符号前,先将之前的数字(如果有的话)加到结果中
			num = 0; // 重置num,为解析下一个数字做准备
			if (c == '+') sign = 1;
			if (c == '-') sign = -1;
		}
	}
	result += sign * num; // 不要忘了加上最后一个数字
	return result;
}

pair<int,string> cal2(vector<char> oper) {
	string ss = "";
	vector<int>	num = { 1,2,3,4,5,6,7,8,9 };
	for (int i = 0; i < oper.size(); i++) {
		if (oper[i] == '*')
			ss += to_string(num[i]);
		else {
			ss += to_string(num[i]) + oper[i];
		}
	}
	ss += '9';
	//cout << ss << endl;
	int res = calculate(ss);
	return make_pair(res,ss);

}

void dfs(int idx, vector<char>& res) {
	// 如果已经到9了则判断当前res是否==110如果等于则记录该res并返回,否则直接返回
	if (idx == 8) {
		int sum = cal2(res).first;
		if (sum == 110) {
			legal_operate.push_back(res);
			return;
		}
		else {
			return;
		}
	}
	for (auto op : operate) {
		// idx==7
		res.push_back(op);
		dfs(idx + 1, res);
		res.pop_back();
	}
}


int main()
{
	vector<int>	num = { 1,2,3,4,5,6,7,8,9 };
	vector<char> res;
	vector<char> op2= { '*','+','*','-','+','*','-','+' };
	vector<char> operator1 = { '+','*','*','-','+','*','*','*' };
	//cout << cal2(op2);
	dfs(0, res);
	//cout << legal_operate.size();
	for (auto vec : legal_operate) {
		cout << cal2(vec).second<<endl;
		for (auto x : vec)
			cout << x << ' ';
		cout << endl;
	}
}


运行结果

在这里插入图片描述

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
解释以下代码:#include "stc32g.h" #include "intrins.h " #define uchar unsigned char void main() { char CY1,CY2,CY3; EAXFR=1; CKCON=0x00; WTST=0x00; CKCON =0x00; WTST= 0x00; P0M0 = 0x00; P0M1 = 0x00; P1M0= 0x00; P1M1= 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1= 0x00; while (1){ P33=1; _nop_(); _nop_(); CY1=P33; P14=1; _nop_(); _nop_(); CY2=P14; P15=1; _nop_(); _nop_(); CY3=P15; if(CY1==1&&CY2==0&&CY3==1){ PWMA_CCER1=0x00; PWMA_CCMR1 =0x60; PWMA_CCMR2 =0x60; PWMA_CCER1= 0x11; PWMA_CCR1H = 0x17; PWMA_CCR1L= 0x00; PWMA_CCR2H = 0x17; PWMA_CCR2L= 0x00; PWMA_ARRH= 0x6f; PWMA_ARRL= 0x00; PWMA_ENO=0x05; PWMA_PS=0x0A; PWMA_BKR= 0x80; PWMA_CR1=0x01; } if(CY1==0&&CY2==1&&CY3==1){ PWMA_CCER1=0x00; PWMA_CCMR1 =0x60; PWMA_CCMR2 =0x60; PWMA_CCER1= 0x11; PWMA_CCR1H = 0x10; PWMA_CCR1L= 0x00; PWMA_CCR2H = 0x17; PWMA_CCR2L= 0x00; PWMA_ARRH= 0x6f; PWMA_ARRL= 0x00; PWMA_ENO=0x05; PWMA_PS=0x0A; PWMA_BKR= 0x80; PWMA_CR1=0x01; } if(CY1==1&&CY2==1&&CY3==0){ PWMA_CCER1=0x00; PWMA_CCMR1 =0x60; PWMA_CCMR2 =0x60; PWMA_CCER1= 0x11; PWMA_CCR1H = 0x17; PWMA_CCR1L= 0x00; PWMA_CCR2H = 0x10; PWMA_CCR2L= 0x00; PWMA_ARRH= 0x6f; PWMA_ARRL= 0x00; PWMA_ENO=0x05; PWMA_PS=0x0A; PWMA_BKR= 0x80; PWMA_CR1=0x01; } if(CY1==0&&CY2==0&&CY3==0){ PWMA_CCER1=0x00; PWMA_CCMR1 =0x60; PWMA_CCMR2 =0x60; PWMA_CCER1= 0x11; PWMA_CCR1H = 0x00; PWMA_CCR1L= 0x00; PWMA_CCR2H = 0x00; PWMA_CCR2L= 0x00; PWMA_ARRH= 0x6f; PWMA_ARRL= 0x00; PWMA_ENO=0x05; PWMA_PS=0x0A; PWMA_BKR= 0x80; PWMA_CR1=0x01; } if(CY1==1&&CY2==1&&CY3==1){ PWMA_CCER1=0x00; PWMA_CCMR1 =0x60; PWMA_CCMR2 =0x60; PWMA_CCER1= 0x11; PWMA_CCR1H = 0x17; PWMA_CCR1L= 0x00; PWMA_CCR2H = 0x17; PWMA_CCR2L= 0x00; PWMA_ARRH= 0x6f; PWMA_ARRL= 0x00; PWMA_ENO=0x05; PWMA_PS=0x0A; PWMA_BKR= 0x80; PWMA_CR1=0x01; } }}
07-11

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值