最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++任意進制轉(zhuǎn)換的代碼實現(xiàn)與優(yōu)化技巧

 更新時間:2025年07月08日 10:40:04   作者:平凡程序猿~  
在編程中,進制轉(zhuǎn)換是一個非常常見的操作,我們常常需要將一個數(shù)從一種進制轉(zhuǎn)換為另一種進制,在本文中,我們將探討如何使用 C++ 實現(xiàn)從任意進制到任意進制的轉(zhuǎn)換,并對代碼進行優(yōu)化,使其更加高效和可讀,需要的朋友可以參考下

從任意進制到任意進制的轉(zhuǎn)換:C++實現(xiàn)與優(yōu)化

在編程中,進制轉(zhuǎn)換是一個非常常見的操作。我們常常需要將一個數(shù)從一種進制轉(zhuǎn)換為另一種進制。例如,二進制、十進制、十六進制等不同進制的數(shù)值廣泛應(yīng)用于計算機科學(xué)、數(shù)學(xué)以及編程中。掌握進制轉(zhuǎn)換的技巧,不僅能幫助我們理解不同數(shù)值表示的方式,還能在多種算法中提高效率。

在本文中,我們將探討如何使用 C++ 實現(xiàn)從任意進制到任意進制的轉(zhuǎn)換,并對代碼進行優(yōu)化,使其更加高效和可讀。

進制轉(zhuǎn)換的基本思路

進制轉(zhuǎn)換的核心思想非常簡單,主要有兩種情況:

  1. 十進制轉(zhuǎn)其他進制:將十進制數(shù)逐步除以目標進制,并記錄每次除法的余數(shù),直到商為零為止。將得到的余數(shù)按逆序排列,得到最終結(jié)果。
  2. 其他進制轉(zhuǎn)十進制:將輸入的字符逐位轉(zhuǎn)換成對應(yīng)的數(shù)值,并根據(jù)目標進制進行累加,最終得出十進制結(jié)果。

代碼實現(xiàn)

1. 十進制轉(zhuǎn)其他進制

從十進制轉(zhuǎn)換到其他進制的操作,我們需要將十進制數(shù)除以目標進制并記錄余數(shù)。重復(fù)此過程直到商為零,并且將余數(shù)反轉(zhuǎn),就得到了目標進制數(shù)的每一位。

void ten_to_else(int num, int k, string &s) {
    if (num == 0) {
        s = "0"; // 防止 num == 0 時沒有結(jié)果
        return;
    }
    while (num) {
        s += dig[num % k];
        num /= k;
    }
    reverse(s.begin(), s.end()); // 翻轉(zhuǎn)結(jié)果
}

這段代碼實現(xiàn)了將十進制數(shù) num 轉(zhuǎn)換成 k 進制的字符串表示。特別地,我們處理了 num == 0 的特殊情況,確保程序可以正確返回 "0"。

2. 其他進制轉(zhuǎn)十進制

對于從其他進制轉(zhuǎn)換為十進制的操作,我們遍歷輸入字符串中的每一個字符,找出它對應(yīng)的數(shù)值,并根據(jù)目標進制進行加權(quán)累加,最終得出十進制的結(jié)果。

int else_to_ten(string &num, int k) {
    int ans = 0;
    for (int i = 0; i < num.size(); i++) {
        int tmp = dig.find(num[i]);
        if (tmp == string::npos || tmp >= k) {
            // 字符不在 dig 中,或者不符合目標進制
            return -1;
        }
        ans = ans * k + tmp;
    }
    return ans;
}

這里,我們遍歷了輸入字符串的每一個字符,使用 dig.find() 找出每個字符在 dig 字符集中的位置,從而得到對應(yīng)的數(shù)值。隨后,我們按進制的權(quán)重計算出最終的十進制數(shù)。

int else_to_ten(string &num, int k) {
    return stoi(num,nullptr,k);
}

3. 主函數(shù)

主函數(shù)負責(zé)接受用戶輸入,并調(diào)用相應(yīng)的轉(zhuǎn)換函數(shù)將輸入的數(shù)值從源進制轉(zhuǎn)換到目標進制,最后輸出結(jié)果。

int main() {
    string num, res;
    int sour, des;

    cout << "請按以下規(guī)則輸入:" << endl;
    cout << "一串?dāng)?shù)字 該數(shù)字的進制 轉(zhuǎn)化后的進制" << endl;
    cin >> num >> sour >> des;

    // 轉(zhuǎn)換為10進制
    int tmp = else_to_ten(num, sour);
    if (tmp == -1) {
        cout << "輸入的數(shù)字不符合源進制的規(guī)則" << endl;
        return 1;
    }

    // 轉(zhuǎn)換為目標進制
    ten_to_else(tmp, des, res);

    cout << sour << "進制下的" << num << "轉(zhuǎn)換為" << des << "進制下的" << res << endl;
    return 0;
}

優(yōu)化與改進

盡管上述代碼能夠完成基本的進制轉(zhuǎn)換功能,但通過一些優(yōu)化,我們可以讓程序更高效、更健壯、更具可讀性。以下是幾個優(yōu)化點:

1. 使用循環(huán)代替遞歸

ten_to_else 函數(shù)中,我們使用了遞歸來完成十進制到其他進制的轉(zhuǎn)換。雖然遞歸簡單易懂,但它可能導(dǎo)致棧溢出,特別是在處理較大數(shù)值時。因此,使用循環(huán)來代替遞歸不僅能避免棧溢出,還能提高性能。

2. 錯誤處理增強

else_to_ten 函數(shù)在遇到非法字符時返回 -1,表示轉(zhuǎn)換失敗。在主函數(shù)中,我們可以根據(jù)這個返回值進行判斷,并輸出明確的錯誤提示,幫助用戶快速定位問題。

3. 精簡 dig 字符集

dig 字符串包含了超過所需的字符。實際上,最多只需要支持到36進制,因此我們可以精簡 dig 字符集,保留從 09 和從 AZ 的字符。

完整優(yōu)化后的代碼

#include <bits/stdc++.h>
using namespace std;

string dig = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 只保留有效字符

// 十進制數(shù)num轉(zhuǎn)換成k進制
void ten_to_else(int num, int k, string &s) {
    if (num == 0) {
        s = "0";
        return;
    }
    while (num) {
        s += dig[num % k];
        num /= k;
    }
    reverse(s.begin(), s.end()); // 翻轉(zhuǎn)結(jié)果
}

// k進制數(shù)num轉(zhuǎn)換成10進制
//int else_to_ten(string &num, int k) {
//    int ans = 0;
//    for (int i = 0; i < num.size(); i++) {
//        int tmp = dig.find(num[i]);
//        if (tmp == string::npos || tmp >= k) {
//            // 字符不在 dig 中,或者不符合目標進制
//            return -1;
//        }
//        ans = ans * k + tmp;
//    }
//    return ans;
//}
int else_to_ten(string &num, int k) {
    return stoi(num,nullptr,k);
}
int main() {
    string num, res;
    int sour, des;
    cout << "請按以下規(guī)則輸入:" << endl;
    cout << "一串?dāng)?shù)字 該數(shù)字的進制 轉(zhuǎn)化后的進制" << endl;
    cin >> num >> sour >> des;
    // 轉(zhuǎn)換為10進制
    int tmp = else_to_ten(num, sour);
    if (tmp == -1) {
        cout << "輸入的數(shù)字不符合源進制的規(guī)則" << endl;
        return 1;
    }
    ten_to_else(tmp, des, res);
    cout << sour << "進制下的" << num << "轉(zhuǎn)換為" << des << "進制下的" << res << endl;
    return 0;
}

總結(jié)

通過本文的討論,我們實現(xiàn)了一個功能完整的進制轉(zhuǎn)換程序,并對代碼進行了優(yōu)化。程序首先將輸入的數(shù)字從源進制轉(zhuǎn)換為十進制,然后再將十進制轉(zhuǎn)換為目標進制。這一過程通過循環(huán)和字符查找來實現(xiàn),避免了棧溢出和非法字符的問題。

優(yōu)化后的程序不僅提升了性能,還增強了用戶體驗,使其更健壯、易于理解和維護。掌握進制轉(zhuǎn)換的基本算法,對于編程中遇到的各類問題非常有幫助。希望本文的講解和代碼實現(xiàn)能夠幫助你更好地理解和使用進制轉(zhuǎn)換方法。

以上就是C++任意進制轉(zhuǎn)換的代碼實現(xiàn)與優(yōu)化技巧的詳細內(nèi)容,更多關(guān)于C++任意進制轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言類型轉(zhuǎn)換與常量的細節(jié)深入理解探究

    C語言類型轉(zhuǎn)換與常量的細節(jié)深入理解探究

    這篇文章主要為大家介紹了C?語言類型轉(zhuǎn)換與常量的細節(jié)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • C++?LeetCode542矩陣示例詳解

    C++?LeetCode542矩陣示例詳解

    這篇文章主要為大家介紹了C++?LeetCode542矩陣示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 用C語言求解第N項斐波那契數(shù)列問題

    用C語言求解第N項斐波那契數(shù)列問題

    這篇文章主要介紹了用C語言求解第N項斐波那契數(shù)列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言實現(xiàn)簡單的抽獎系統(tǒng)

    C語言實現(xiàn)簡單的抽獎系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的抽獎系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • C++?超詳細分析多態(tài)的原理與實現(xiàn)

    C++?超詳細分析多態(tài)的原理與實現(xiàn)

    這篇文章主要介紹了C++多態(tài)的原理與實現(xiàn),多態(tài)是一種面向?qū)ο蟮脑O(shè)計思路,本身和C++不是強綁定的,其他語言當(dāng)中一樣有多態(tài),只不過實現(xiàn)的方式可能有所不同。下面來一起了解更多詳細內(nèi)容吧
    2022-03-03
  • C++詳解非類型模板參數(shù)Nontype與Template及Parameters的使用

    C++詳解非類型模板參數(shù)Nontype與Template及Parameters的使用

    除了類型可以作為模板參數(shù),普通值也可以作為模板函數(shù),即非類型模板參數(shù)(Nontype Template Parameters)。下面讓我們一起了解一下
    2022-06-06
  • C語言?智能指針?shared_ptr?和?weak_ptr

    C語言?智能指針?shared_ptr?和?weak_ptr

    這篇文章主要介紹了C語言?智能指針?shared_ptr?和?weak_ptr,weak_ptr引入可以解決shared_ptr交叉引用時無法釋放資源的問題,下面來學(xué)習(xí)具體相關(guān)內(nèi)容吧,需要的朋友可以參考一下
    2022-04-04
  • C++中g(shù)etline()、gets()等函數(shù)的用法詳解

    C++中g(shù)etline()、gets()等函數(shù)的用法詳解

    這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • QT出現(xiàn)沒有MySQL驅(qū)動手動編譯詳細步驟

    QT出現(xiàn)沒有MySQL驅(qū)動手動編譯詳細步驟

    這篇文章主要給大家介紹了關(guān)于QT出現(xiàn)沒有MySQL驅(qū)動手動編譯詳細步驟的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家學(xué)習(xí)或者使用QT具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-04-04
  • C語言中函數(shù)的聲明、定義及使用的入門教程

    C語言中函數(shù)的聲明、定義及使用的入門教程

    這篇文章主要介紹了C語言中函數(shù)的聲明、定義及使用的入門教程,重點講述了main函數(shù)的相關(guān)知識,需要的朋友可以參考下
    2015-12-12

最新評論

石嘴山市| 衢州市| 张家川| 湾仔区| 龙江县| 茌平县| 昌黎县| 莫力| 延吉市| 尖扎县| 孙吴县| 孟州市| 镇安县| 开阳县| 阳新县| 福贡县| 那坡县| 剑川县| 东阿县| 扶余县| 西和县| 财经| 道孚县| 民权县| 珠海市| 阜康市| 兰坪| 柳江县| 皮山县| 龙口市| 台东县| 上蔡县| 宽城| 余江县| 海晏县| 菏泽市| 毕节市| 鄂尔多斯市| 阳原县| 光山县| 增城市|