使用指定的操作将数字转换为另一个数字。在这方面需要一些帮助

阿比纳夫·塔拉尼

这是我最近遇到的一个问题-

假设我有 3 个整数 k,m,n。我必须以最少的操作次数k达到m,并且可能的操作是-

你可以乘ķ通过ñ

您可以将k减少 2。

您可以将k减少 1。

此外,这 3 个操作可以按任意顺序执行。

有多种方法可以尝试这种方法 - 无论是递归还是动态方法。但是我找到了一个有趣的解决方案,它没有实现它们,而且我很难破译它。这是参考代码-

        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        int m = sc.nextInt();
        int n = sc.nextInt();
        int count = 0;
        int x = 0;
        while (k < m) {
            if (m % n == 0) {
                m = m / n;
                count++;
            } else {
                x = (n - (m % n));
                m += (x) / 2 * 2 + (x) % 2;
                count += x / 2 + x % 2;
            }
        }
        if (k > m) {
            count += (k - m) / 2 + (k - m) % 2;
        }
        System.out.println(count);

好吧,我真的很抱歉不能包含注释,因为我无法掌握这段代码。有人可以浏览一遍代码,并解释这段代码实际上是如何工作的吗?会有很大的帮助!(顺便说一句,代码运行良好!)

进入虚空

因此,该算法的主要作用如下:

  1. 将当前 m 向上舍入为 n 的偶数倍,但前提是 m 已经不是 n 的偶数倍,然后将 m 除以 n。第一部分可以使用以下行完成(如果 m 已经是 n 的偶数倍,则结果为 0):

x = n - (m - 1) % n - 1;

通过将 x 添加到 m,我们将使 m 成为 n 的偶数倍,或者保持 m 原样,如果它已经是 1。

  1. 但是我们也可以使用 x 来计算我们执行的操作数。

您可以将 k 乘以 n。您可以将 k 减少 2。您可以将 k 减少 1

这意味着如果我们将这些规则应用于 m 那么它们应该是这样的(如果我错了,请纠正我):

您可以将 m 除以 n。您可以将 m 增加 2。您可以将 m 增加 1

  1. 因此,每次我们将 m 舍入到 n 的下一个偶数倍数时,我们基本上说我们将 m 的值增加了 2 个“x / 2 倍”,但是由于这仅在 x 为偶数时才有效,因此我们也可以说我们将 m 增加了一个如果 x 不偶数,则额外 1。

因此,对于这一步,我们需要将计数值增加“x / 2 + x % 2”

  1. 现在我们已经完成了这个,我们需要将 m 除以 n(正如我对 m 而不是 k 的倒置规则所说,你现在可以这样做)。m 除以 n 后,我们需要给计数器加 1,因为我们执行了一次操作。

这是完整的精简代码:

int count = 0, x;
while (k < m) {
    x = n - (m - 1) % n - 1;
    m = (m + x) / n;
    count += x / 2 + x % 2 + 1;
}
if (k > m) {
    count += (k - m) / 2 + (k - m) % 2;
}

结论:

该算法按照规则对 m 执行所有操作,而不是对 k 执行所有操作。因此,您需要“颠倒”规则(就像我上面所做的那样)然后用“新”规则集分析代码,并确定它基本上已经遵循了“新”规则集。巧合,我不这么认为!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将一个数字转换为另一个由 9 组成的数字

将双精度类型转换为另一个数字类型

如何将数字转换为R中另一个数字的第一个整除数

如何使用python中的替换字典将一个数字替换为另一个数字?

如何将列转换为以另一个数字列中的值为条件的和?

当变量同时包含范围和一个数字时,需要帮助将数字范围转换为R中的平均值

数组操作:将一个数组转换为另一个数组

将最后一位数字替换为另一个数字

如何使用PHP中的if else语句将第二个数字替换为另一个数字?

检查向量中的每个数字是否在R中另一个向量中的一些数字之间

将空格数字“”替换为另一个

将div元素中多个实例上找到的数字替换为另一个数字

需要一些帮助来理解这段代码的一个方面

SAS:将字符转换为数字而不创建另一个变量

将数字范围转换为另一个范围,保持比例

根据python中的另一个列表将列表中的字母转换为数字

将一个数组的一些索引复制到另一个数组

数字在另一个数字的5%以内

仅使用两个操作遍历二叉树以从一个数字到另一个数字

当找到一个数字的主要因素时,一些数字会起作用,而另一些则不会

将数字从一个数字映射到另一个数字的代码,其中每个数字的距离都大于1

将数字的标志放到另一个数字上?

如何将数字的格式复制到另一个数字?

如何将列表中的数字更改为另一个数字

如何计算一个数字是否是另一个数字的幂?

数字以及可被另一个数字整除的数字的数字(例如 3)

将数字从一个范围转换到另一个范围

使用一些参数将另一个小节添加到RenderFragment

从一个数字到另一个数字,而不是从另一个数组中获取数字