C++ 中用最少的操作符表示数字
假设我们有一个正整数 x,我们将编写一个形如 x (op1) x (op2) x (op3) x ... 的表达式,其中 op1、op2 等是运算符。这些运算符可以是加法、减法、乘法或除法。例如,当 x = 3 时,我们可以写 3 * 3 / 3 + 3 - 3,其值为 3。有一些规则,如下所示 -
除法运算符 (/) 返回有理数。
任何地方都不使用括号。
我们使用通常的运算顺序 - 乘法和除法优先于加法和减法。
不允许使用一元否定运算符。
我们必须编写一个运算符数量最少的表达式,使得该表达式等于给定的目标。因此,我们将找到最少的运算符数量。
因此,如果输入类似于 x = 4,target = 15,则输出将为 3,因为我们可以将 15 表示为 4*4- 4/4
为了解决这个问题,我们将遵循以下步骤 -
如果目标与 x 相同,则 -
如果 x > target,则 -
返回 (x - target) * 2 和 (target * 2) - 1 的最小值
sum := x,t := 0
当 sum < target 时,执行 -
sum := sum * x
(t 加 1)
如果 sum 与 target 相同,则 -
返回 t
l := inf,r := inf
如果 sum - target target,则 -
r := leastOpsExpressTarget(x, sum - target)
l := leastOpsExpressTarget(x, target - (sum / x))
返回 1 + l 和 r 的最小值
让我们看看以下实现以获得更好的理解 -
示例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int leastOpsExpressTarget(int x, int target) { if(target == x) return 0; if(x > target){ return min((x - target) * 2, (target * 2) - 1); } lli sum = x; int t = 0; while(sum < target){ sum *= x; t++; } if(sum == target) return t; int l = INT_MAX; int r = INT_MAX; if(sum - target < target){ r = leastOpsExpressTarget(x, sum - target) + t; } l = leastOpsExpressTarget(x, target - (sum / x)) + t - 1; return min(l, r) + 1; } }; main(){ Solution ob; cout << (ob.leastOpsExpressTarget(4, 15)); }
输入
4, 15
输出
3
广告