描述
给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。
输入描述:
读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。
输出描述:
对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false
示例1
输入:
7 2 1 10复制
输出:
true
1)题目只会给四个数,运算符仅允许出现在两个数之间,故四个数之间总共会有三个运算符;
2)本题对数字顺序无要求,所以每种排序都需要考虑,此处可以轮询C++全排列库函数的结果
next_permutation(nums.begin(), nums.end())
3)将四种运算封装为函数op,op的入参是两个操作数及操作符;
4)遍历四个数字之间的三个运算符,每个运算符都有四种可能,故此处使用了4*4*4的循环遍历,每两个数运算的结果再跟下一个数运算,知道运算结果为24;
5)除法需要特别注意,需要考虑除数为0、以及不能整除的情况
if (num2 != 0 && (num1 % num2 == 0)) {
res = num1 / num2;
} else {
res = 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include <cmath>
using namespace std;
int op(int num1, int num2, int flag) {
int res = 0;
switch (flag) {
case 1:
{
res = num1 + num2;
break;
}
case 2:
{
res = num1 - num2;
break;
}
case 3:
{
res = num1 * num2;
break;
}
case 4:
{
if (num2 != 0 && (num1 % num2 == 0)) {
res = num1 / num2;
} else {
res = 0;
}
break;
}
}
return res;
}
// nums 原始数组
// require 运算需要达到的结果值
bool func(vector<int> &nums, int require) {
int flag[4] = {1,2,3,4}; //分别对应 + - * /
sort(nums.begin(), nums.end());
do {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
int res = op(nums[0], nums[1], flag[i]);
res = op(res, nums[2], flag[j]);
res = op(res, nums[3], flag[k]);
if (res == require) {
/*cout << i << ", " << j << ", " << k << endl;
cout << res << endl;
for (int i = 0; i < 4; i++) {
cout << nums[i];
}*/
return true;
}
}
}
}
}while(next_permutation(nums.begin(), nums.end()));
return false;
}
int main()
{
int res = false;
vector<int> num(4, 0);
for (int i = 0; i < 4; i++) {
cin >> num[i];
}
if (func(num, 24)) {
res = true;
}
if (res) cout << "true" << endl;
else cout << "false" << endl;
return 0;
}

京公网安备 11010502036488号