比如有4个数 2 11 9 7
将2与24进行加减乘除运算,比如 24-2=22 ,那么问题就是11 9 7三个数怎么运算能耐得到22,同理11与22运算 比如22/11=2 那就编程9和7如何运算得到2的问题了。
这样将4个数的问题逐步缩小成2个数的问题。
但是这种逻辑和数的顺序有关,所以一边下来如果无解,利用下标变化依次将位置提前 s3(24 - x[i], x[(i + 1) % 4], x[(i + 2) % 4], x[(i + 3) % 4]); i++;如果仍然无解,将1,3 互换2,4互换。一般会得到正确结果。
这个逻辑不会覆盖所有情况,比如需要需要(x+y)*(z+t)这种算式。
#include <iostream> #include <string> using namespace std; bool f = false; string s = ""; void s2(int g, int x, int y) { if (x + y == g) { s = to_string(x) + '+' + to_string(y); f = true; return; } if (x - y == g) { s = to_string(x) + '-' + to_string(y); f = true; return; } if (y - x== g) { s = to_string(y) + '-' + to_string(x); f = true; return; } if (y* x == g) { s = to_string(y)+ '*' + to_string(x); f = true; return; } if (y/x == g&&y%x==0) { s = to_string(y) + '/'+ to_string(x); f = true; return; } if (x / y == g && x % y == 0) { s = to_string(x) + '/' + to_string(y); f = true; return; } } void s3(int g, int x, int y, int z) { s2(g - x, y, z); if (f) { s = to_string(x) + '+' + s; return; } s2(x - g, y, z); if (f) { s = to_string(x) + "-(" + s+')'; return; } s2(g + x, y, z); if (f) { s =s+'-'+ to_string(x) ; return; } s2(g* x, y, z); if (f) { s ='('+ s + ")/" + to_string(x); return; } if (g % x == 0) { s2(g / x, y, z); if (f) { s = to_string(x) + "*(" + s + ")"; return; } } if (x % g == 0) { s2(x / g, y, z); if (f) { s = to_string(x) + "/(" + s + ")"; return; } } } int main(int argc,char* argv[]) { int x[4]; s = ""; f = false; // std::cin >> x[0] >> x[1] >> x[2] >> x[3]; x[0]= stoi(argv[1]); x[1] = stoi(argv[2]); x[2] = stoi(argv[3]); x[3] = stoi(argv[4]); for (int j = 0; j < 2; j++)// 原顺序无解时 1 3换位置,再无解2,4换位置 { int i = 0; while (i < 4) //原顺序无解是,依次循环 { s3(24 - x[i], x[(i + 1) % 4], x[(i + 2) % 4], x[(i + 3) % 4]); if (f) { s = to_string(x[i]) + '+' + s; cout << s << "\r\n"; break; } s3(24 + x[i], x[(i + 1) % 4], x[(i + 2) % 4], x[(i + 3) % 4]); if (f) { s = s + "-" + to_string(x[i]); cout << s << "\r\n"; break; } s3(24 * x[i], x[(i + 1) % 4], x[(i + 2) % 4], x[(i + 3) % 4]); if (f) { s = s + "/" + to_string(x[i]); cout << s << "\r\n"; break; } if (24 % x[i] == 0) { s3(24 / x[i], x[(i + 1) % 4], x[(i + 2) % 4], x[(i + 3) % 4]); if (f) { s = to_string(x[i]) + "*(" + s + ')'; cout << s << "\r\n"; break; } } i++; } int t = x[j]; if (f) break; else { x[j] = x[j + 2]; x[j + 2] = t; j++; } } if(!f) std::cout << "尽力了\n"; }