描述
给出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; }