首頁 >後端開發 >C++ >將1轉換為N的最小成本,可以透過乘以X或數字的右旋轉來實現

將1轉換為N的最小成本,可以透過乘以X或數字的右旋轉來實現

WBOY
WBOY轉載
2023-09-12 20:09:07723瀏覽

將1轉換為N的最小成本,可以透過乘以X或數字的右旋轉來實現

我們可以使用以下技術來找到乘以 X 或將其數字從 1 右旋轉到 N 的最便宜方法。若要監控初始最低成本,請建立一個成本變數。當從 N 到 1 時,檢查每個階段 N 是否被 X 整除。如果是,則將 N 除以 X 來更新它並繼續該過程。如果 N 無法被 X 整除,則將 N 的數字向右循環以增加其值。在這種情況下增加成本變數。最終的成本變數值將是將 1 變為 N 所需的最少數量。該演算法有效地確定使用數位旋轉或乘法進行所需轉換所需的最少操作。

使用的方法

  • Naive Approach: 數字的右旋轉

  • #高效方法:乘以 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。

  • 從給定的目標數N開始,使用固定的乘數X。

  • 只要N大於1,重複步驟4到6。

  • 假設N% X == 0,判斷N是否能被X整除。

  • 如果 N 可整除(N = N / X),則將 N 除以 X,然後在「cost」變數中加 1。

  • 如果不可整除,則將 N 的數字向右循環(透過將最後一位數字移至第一位)並將「成本」增加 1。

  • 在N變成1之前,重複步驟3到6。

  • 最後一個"cost"表示乘以X或將數字右移以將1變為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 的最經濟方法。該策略解決了確定該轉換過程的最低成本的問題,並被證明是一種更有用和有效的演算法。

以上是將1轉換為N的最小成本,可以透過乘以X或數字的右旋轉來實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除