C++任意進(jìn)制轉(zhuǎn)換的代碼實(shí)現(xiàn)與優(yōu)化技巧
從任意進(jìn)制到任意進(jìn)制的轉(zhuǎn)換:C++實(shí)現(xiàn)與優(yōu)化
在編程中,進(jìn)制轉(zhuǎn)換是一個(gè)非常常見的操作。我們常常需要將一個(gè)數(shù)從一種進(jìn)制轉(zhuǎn)換為另一種進(jìn)制。例如,二進(jìn)制、十進(jìn)制、十六進(jìn)制等不同進(jìn)制的數(shù)值廣泛應(yīng)用于計(jì)算機(jī)科學(xué)、數(shù)學(xué)以及編程中。掌握進(jìn)制轉(zhuǎn)換的技巧,不僅能幫助我們理解不同數(shù)值表示的方式,還能在多種算法中提高效率。
在本文中,我們將探討如何使用 C++ 實(shí)現(xiàn)從任意進(jìn)制到任意進(jìn)制的轉(zhuǎn)換,并對代碼進(jìn)行優(yōu)化,使其更加高效和可讀。
進(jìn)制轉(zhuǎn)換的基本思路
進(jìn)制轉(zhuǎn)換的核心思想非常簡單,主要有兩種情況:
- 十進(jìn)制轉(zhuǎn)其他進(jìn)制:將十進(jìn)制數(shù)逐步除以目標(biāo)進(jìn)制,并記錄每次除法的余數(shù),直到商為零為止。將得到的余數(shù)按逆序排列,得到最終結(jié)果。
- 其他進(jìn)制轉(zhuǎn)十進(jìn)制:將輸入的字符逐位轉(zhuǎn)換成對應(yīng)的數(shù)值,并根據(jù)目標(biāo)進(jìn)制進(jìn)行累加,最終得出十進(jìn)制結(jié)果。
代碼實(shí)現(xiàn)
1. 十進(jìn)制轉(zhuǎn)其他進(jìn)制
從十進(jìn)制轉(zhuǎn)換到其他進(jìn)制的操作,我們需要將十進(jìn)制數(shù)除以目標(biāo)進(jìn)制并記錄余數(shù)。重復(fù)此過程直到商為零,并且將余數(shù)反轉(zhuǎn),就得到了目標(biāo)進(jìn)制數(shù)的每一位。
void ten_to_else(int num, int k, string &s) {
if (num == 0) {
s = "0"; // 防止 num == 0 時(shí)沒有結(jié)果
return;
}
while (num) {
s += dig[num % k];
num /= k;
}
reverse(s.begin(), s.end()); // 翻轉(zhuǎn)結(jié)果
}
這段代碼實(shí)現(xiàn)了將十進(jìn)制數(shù) num 轉(zhuǎn)換成 k 進(jìn)制的字符串表示。特別地,我們處理了 num == 0 的特殊情況,確保程序可以正確返回 "0"。
2. 其他進(jìn)制轉(zhuǎn)十進(jìn)制
對于從其他進(jìn)制轉(zhuǎn)換為十進(jìn)制的操作,我們遍歷輸入字符串中的每一個(gè)字符,找出它對應(yīng)的數(shù)值,并根據(jù)目標(biāo)進(jìn)制進(jìn)行加權(quán)累加,最終得出十進(jì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 中,或者不符合目標(biāo)進(jìn)制
return -1;
}
ans = ans * k + tmp;
}
return ans;
}
這里,我們遍歷了輸入字符串的每一個(gè)字符,使用 dig.find() 找出每個(gè)字符在 dig 字符集中的位置,從而得到對應(yīng)的數(shù)值。隨后,我們按進(jìn)制的權(quán)重計(jì)算出最終的十進(jìn)制數(shù)。
int else_to_ten(string &num, int k) {
return stoi(num,nullptr,k);
}

3. 主函數(shù)
主函數(shù)負(fù)責(zé)接受用戶輸入,并調(diào)用相應(yīng)的轉(zhuǎn)換函數(shù)將輸入的數(shù)值從源進(jìn)制轉(zhuǎn)換到目標(biāo)進(jìn)制,最后輸出結(jié)果。
int main() {
string num, res;
int sour, des;
cout << "請按以下規(guī)則輸入:" << endl;
cout << "一串?dāng)?shù)字 該數(shù)字的進(jìn)制 轉(zhuǎn)化后的進(jìn)制" << endl;
cin >> num >> sour >> des;
// 轉(zhuǎn)換為10進(jìn)制
int tmp = else_to_ten(num, sour);
if (tmp == -1) {
cout << "輸入的數(shù)字不符合源進(jìn)制的規(guī)則" << endl;
return 1;
}
// 轉(zhuǎn)換為目標(biāo)進(jìn)制
ten_to_else(tmp, des, res);
cout << sour << "進(jìn)制下的" << num << "轉(zhuǎn)換為" << des << "進(jìn)制下的" << res << endl;
return 0;
}
優(yōu)化與改進(jìn)
盡管上述代碼能夠完成基本的進(jìn)制轉(zhuǎn)換功能,但通過一些優(yōu)化,我們可以讓程序更高效、更健壯、更具可讀性。以下是幾個(gè)優(yōu)化點(diǎn):
1. 使用循環(huán)代替遞歸
在 ten_to_else 函數(shù)中,我們使用了遞歸來完成十進(jìn)制到其他進(jìn)制的轉(zhuǎn)換。雖然遞歸簡單易懂,但它可能導(dǎo)致棧溢出,特別是在處理較大數(shù)值時(shí)。因此,使用循環(huán)來代替遞歸不僅能避免棧溢出,還能提高性能。
2. 錯(cuò)誤處理增強(qiáng)
else_to_ten 函數(shù)在遇到非法字符時(shí)返回 -1,表示轉(zhuǎn)換失敗。在主函數(shù)中,我們可以根據(jù)這個(gè)返回值進(jìn)行判斷,并輸出明確的錯(cuò)誤提示,幫助用戶快速定位問題。
3. 精簡 dig 字符集
dig 字符串包含了超過所需的字符。實(shí)際上,最多只需要支持到36進(jìn)制,因此我們可以精簡 dig 字符集,保留從 0 到 9 和從 A 到 Z 的字符。
完整優(yōu)化后的代碼
#include <bits/stdc++.h>
using namespace std;
string dig = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 只保留有效字符
// 十進(jìn)制數(shù)num轉(zhuǎn)換成k進(jìn)制
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進(jìn)制數(shù)num轉(zhuǎn)換成10進(jìn)制
//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 中,或者不符合目標(biāo)進(jìn)制
// 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ù)字的進(jìn)制 轉(zhuǎn)化后的進(jìn)制" << endl;
cin >> num >> sour >> des;
// 轉(zhuǎn)換為10進(jìn)制
int tmp = else_to_ten(num, sour);
if (tmp == -1) {
cout << "輸入的數(shù)字不符合源進(jìn)制的規(guī)則" << endl;
return 1;
}
ten_to_else(tmp, des, res);
cout << sour << "進(jìn)制下的" << num << "轉(zhuǎn)換為" << des << "進(jìn)制下的" << res << endl;
return 0;
}
總結(jié)
通過本文的討論,我們實(shí)現(xiàn)了一個(gè)功能完整的進(jìn)制轉(zhuǎn)換程序,并對代碼進(jìn)行了優(yōu)化。程序首先將輸入的數(shù)字從源進(jìn)制轉(zhuǎn)換為十進(jìn)制,然后再將十進(jìn)制轉(zhuǎn)換為目標(biāo)進(jìn)制。這一過程通過循環(huán)和字符查找來實(shí)現(xiàn),避免了棧溢出和非法字符的問題。
優(yōu)化后的程序不僅提升了性能,還增強(qiáng)了用戶體驗(yàn),使其更健壯、易于理解和維護(hù)。掌握進(jìn)制轉(zhuǎn)換的基本算法,對于編程中遇到的各類問題非常有幫助。希望本文的講解和代碼實(shí)現(xiàn)能夠幫助你更好地理解和使用進(jìn)制轉(zhuǎn)換方法。
以上就是C++任意進(jìn)制轉(zhuǎn)換的代碼實(shí)現(xiàn)與優(yōu)化技巧的詳細(xì)內(nèi)容,更多關(guān)于C++任意進(jìn)制轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MFC程序中使用QT開發(fā)界面的實(shí)現(xiàn)步驟
本文主要介紹了MFC程序中使用QT開發(fā)界面的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
C++實(shí)現(xiàn)班級成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)班級成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C語言strlen和sizeof在數(shù)組中的使用詳解
對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質(zhì)區(qū)別2021-10-10
基于Qt開發(fā)獲取CTP量化交易接口測試數(shù)據(jù)工具
這篇文章主要為大家詳細(xì)介紹了如何使用Qt軟件開發(fā)K線股P相關(guān)軟件,先開發(fā)一個(gè)通過CTP量化交易的sdk獲取相關(guān)推送數(shù)據(jù)的工具,需要的可以參考下2024-04-04

