.net做网站开发吗,wordpress收录慢,帝国网站整站迁移,贵阳网络推广哪家专业题目 思路
--暴力递归全组合的方法。只有4个数#xff0c;4种计算方式#xff0c;共有4 * 3 * 2 * 1 * 4种不同的情况#xff0c;可以写递归来实现。
--每次计算都是两个数之间的运算#xff0c;因此4个数需要3次计算#xff0c;第一次计算前有4个数#xff0c;第二次有…题目 思路
--暴力递归全组合的方法。只有4个数4种计算方式共有4 * 3 * 2 * 1 * 4种不同的情况可以写递归来实现。
--每次计算都是两个数之间的运算因此4个数需要3次计算第一次计算前有4个数第二次有3个数第三次有两个数那么怎么在数组长度恒为4时将每次计算需要使用的数字个数减少呢就可以将a[0]来记录n个数的最后一个数的值让前面n个数始终为有效数字。
代码
#include iostream
#include vector
#include cmath
using namespace std;int a[4];
int maxr;void dg(int n){if (n 1){if (a[0] 24){maxr max(maxr, a[0]);}return;}else{for (int i 0; i n - i; i){for (int j i 1; j n; j){ //双重循环正好是4 * 3 * 2 * 1种可能。 int b1 a[i];int b2 a[j]; //找a[i]和a[j]的替身。 a[j] b1 b2;a[i] a[n - 1]; //将a[i]和最后一个数替换使得有效数字逐渐减少非常巧妙的方法。 dg(n - 1);a[j] b1 - b2;a[i] a[n - 1]; //每个递归的前面都要重新确定a[i]的值上一次递归结束后a[i]的值很可能改变。 dg(n - 1);a[j] b2 - b1;a[i] a[n - 1];dg(n - 1);a[j] b1 * b2;a[i] a[n - 1];dg(n - 1);if (b2 ! 0 b1 % b2 0){ //除数不能为0 a[j] b1 / b2;dg(n - 1);}if (b1 ! 0 b2 % b1 0){a[j] b2 / b1;dg(n - 1);}a[i] b1;a[j] b2;}}}
}
int main(){int n;cin n;for (int i 0; i n; i){maxr 0; //每次循环都要将其定为0否则以后输出的都是最大值 for (int j 0; j 4; j){cin a[j];}dg(4);cout maxr endl;}return 0;
}