【发布时间】:2019-04-27 12:51:47
【问题描述】:
最近几天在尝试完成以下任务时遇到了一些困难,希望大家能提供帮助:
我得到一个单一的数字 N,我可以在每次移动中对 N 执行两个操作中的任何一个:
一 - 如果我们取 2 个整数,其中 N = x * y ,那么我们可以将 N 的值更改为 x 和 y 之间的最大值。
二 - 将 N 的值减 1。
我想找到将 N 减少到零的最小步数。 这是我到目前为止所拥有的,我不确定实现查找除数 (someFindDevisorFunction) 的函数的最佳方法是什么,以及这个 'f' 函数是否真的会产生所需的输出.
int f(int n)
{
int div,firstWay,secondWay;
if(n == 0)
return 0;
div = SomefindDivisorFunction(n);
firstWay = 1 + f(n-1);
if(div != 1)
{
secondWay = 1 + f(div);
if (firstWay < secondWay)
return firstWay;
return secondWay;
}
return firstWay;
}
例如,如果我输入数字 150 ,输出将是: 75 - 25 - 5 - 4 - 2 - 1 - 0
【问题讨论】:
-
我不明白:对于 150 我会说:150=15*10 => 15. 15=5*3=> 5, ...,这比您的建议少了一步解决方案。
-
我不明白为什么你的输出有 75 作为 150 的第一步。为什么不是 15,因为 150 = 15 * 10 和 15 = max(15, 10)?在我看来,通过选择 a 和 b 作为最接近 sqrt(N) 的整数辅因子,您可以最快地收敛到零。
-
您的问题是什么?与您展示的简单蛮力不同的方法?
SomefindDivisorFunction()的代码?请更具体。如果是函数的代码,那么请考虑将您的问题集中在该部分上, -
你忘了一个问题吗?例如,关于 a 和 b 是否互质?否则,如这里建议的那样,您应该考虑它,以便这两个因素尽可能接近 sqrt(N)。
-
正如问题中所述,对于任何正 N,我们有 N → -1(因为 N = -1•-N 和 -1 = max(-1, -N)) → -2(递减)→ 2(因为 -2 = -1•2)→ 1(递减)→ 0(递减)。