将 1 乘以 X 或右旋数字转换为 N 的最低成本


我们可以使用以下技术来找到将 1 乘以 X 或将其数字右旋转到 N 的最便宜方法。为了监控初始最低成本,创建一个成本变量。在您从 N 到 1 的过程中,在每个阶段检查 N 是否能被 X 整除。如果是,则将 N 除以 X 以更新它并继续该过程。如果它不能被 X 整除,则将 N 的数字向右旋转以增加其值。在这种情况下,增加成本变量。最终的成本变量值将是将 1 更改为 N 所需的最低金额。此算法有效地确定了使用数字旋转或乘法执行所需转换所需的最小操作次数。

使用的方法

  • 朴素方法:数字右旋转

  • 高效方法:乘以 X

朴素方法:数字右旋转

朴素方法是从数字 1 开始,重复将其数字向右旋转,直到达到目标数字 N。在每次旋转中,最后一个数字成为第一个数字。尽管概念简单,但对于较大的 N 值,此策略可能效率低下,因为它可能需要许多步骤才能达到目标数字。随着 N 的增加,旋转次数也迅速增加,这使得它成为确定将 1 转换为 N 的最低成本的不太有效的方法。由于其效率低下,不建议对大型 N 值使用此方法,并且替代方法(例如将 N 除以 X)被证明在查找转换的最低成本方面更有效。

算法

  • 创建变量“cost”以跟踪达到 N 所需的步骤,将其初始化为 1 以表示当前值。

  • 重复执行以下步骤,直到当前数字等于 N

    将当前数字的数字向右旋转,使最后一个数字成为第一个数字。

    将“cost”变量增加 1 以跟踪所需的旋转次数。

  • 一旦当前数字等于 N,“cost”变量将存储使用右旋转将原始整数 (1) 旋转到 N 所需的最小步骤。

示例

#include <iostream>
#include <cmath>

int rotateDigits(int num, int numDigits) {
    return (num / 10) + (num % 10) * std::pow(10, numDigits - 1);
}

int main() {
    int N = 123; // Replace this with your desired N value

    int current = 1;
    int cost = 0;
    bool found = false;

    while (current != N) {
        int numDigits = std::to_string(current).length();
        current = rotateDigits(current, numDigits);
        cost++;

        if (cost > N) {
            std::cout << "N cannot be reached from 1 using right rotations." << std::endl;
            found = true;
            break;
        }
    }

    if (!found) {
        std::cout << "Minimum steps to reach N: " << cost << std::endl;
    }
    return 0;
}

输出

N cannot be reached from 1 using right rotations.

高效方法:乘以 X

将 1 乘以 N 的成本降至最低的最佳方法是定期将 N 除以 X,直到结果为 1。为了实现这一点,初始化一个成本变量来监控最低成本。我们从 N 的值开始,确定 N 是否可被 X 整除。如果 N 和 X 都可被整除,则成本增加并进行除法。您继续这样做,直到 N 等于 1。此方法比“数字右旋转”更有效,因为它总共涉及更少的步骤才能得到结果 1。由于其更快、更有效,它是计算可行最低转换成本的首选方法。

算法

  • 为了跟踪最低成本,将变量“cost”初始化为 0。

  • 从固定的乘数 X 和提供的目标数字 N 开始。

  • 只要 N 大于 1,就重复步骤 4 到 6。

  • 假设 N% X == 0,确定 N 是否可被 X 整除。

  • 如果它可被整除 (N = N / X),则将 N 除以 X,然后将“cost”变量加 1。

  • 如果不可被整除,则将 N 的数字向右旋转(通过将最后一个数字移到第一个位置)并将“cost”加 1。

  • 重复步骤 3 到 6,直到 N 变成 1。

  • 最后的“cost”表示将 1 乘以 X 或将数字向右旋转以更改为 N 所需的绝对最小值。

示例

#include <iostream>
#include <cmath>

int main() {
    int X = 3;
    int N = 100;
    int cost = 0;

    while (N > 1) {
        if (N % X == 0) {
            N /= X;
            cost++;
        } else {
            int lastDigit = N % 10;
            N = (N / 10) + (lastDigit * std::pow(10, std::floor(std::log10(N))));
            cost++;
        }
    }

    std::cout << "Final cost: " << cost << std::endl;

    return 0;
}

输出

Final cost: 2

结论

总之,当确定通过乘以 X 或右旋数字将 1 转换为 N 的最低成本时,乘以 X 的高效方法优于数字右旋转的朴素方法。高效方法提供的更简化的方法需要更少的步骤才能达到所需的数字 N。另一方面,朴素方法可能效率低下且耗时,尤其是在 N 值较高的情况下。通过使用高效方法,我们可以减少所需的过程数量并确定将 1 转换为 N 的最经济方法。此策略解决了确定此转换过程的最低成本的问题,并且被证明是一种更有用且有效的算法。

更新于:2023 年 8 月 2 日

62 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告