題目鏈接:
10進制 VS 2進制http://www.nowcoder.com/share/jump/437195121691738172415
描述
對于一個十進制數A,將A轉換為二進制數,然后按位逆序排列,再轉換為十進制數B,我們稱B為A的二進制逆序數。 例如對于十進制數173,它的二進制形式為10101101,逆序排列得到10110101,其十進制數為181,181即為173的二進制逆序數。
輸入描述:
一個1000位(即10^999)以內的十進制數。
輸出描述:
輸入的十進制數的二進制逆序數。
示例1
輸入:
173
輸出:
181
思路:
- 輸入一個十進制數
s
。 - 使用大整數除法函數
divide
將s
不斷除以 2,得到二進制數的各個位,存放在向量binary
中,順序是按位逆序排列的。 - 初始化一個字符串
res
為 "0",用于存放最終的結果。 - 遍歷
binary
中的每一位,將res
乘以 2(相當于左移一位),然后加上當前位的值,得到二進制逆序數的十進制表示。 - 輸出最終的二進制逆序數。
注意:代碼中使用了字符串來表示大整數,通過模擬除法、乘法和加法操作,實現了對二進制逆序數的計算和轉換。
源代碼:
#include<iostream>
#include<string>
#include<vector>
using namespace std;// 例題6.3 KY26 10進制 VS 2進制 // 字符串表示的大整數除法
string divide(string str, int x) {int reminder = 0; // 余數for (int i = 0; i < str.size(); i++) {int current = reminder * 10 + str[i] - '0'; // 當前位的數值str[i] = current / x + '0'; // 更新當前位的值為商的字符表示reminder = current % x; // 更新余數}int pos = 0;while (str[pos] == '0') {pos++; // 移除前導零}return str.substr(pos); // 返回除法結果,移除前導零
}string multiple(string str, int x) {int carry = 0; // 進位for (int i = str.size() - 1; i >= 0; i--) {int current = x * (str[i] - '0') + carry; // 當前位的計算結果str[i] = current % 10 + '0'; // 更新當前位的值為計算結果的個位carry = current / 10; // 更新進位}if (carry != 0) {str = "1" + str; // 處理最終的進位}return str;
}string Add(string str, int x) {int carry = x; // 初始進位為 xfor (int i = str.size() - 1; i >= 0; i--) {int current = (str[i] - '0') + carry; // 當前位的計算結果str[i] = current % 10 + '0'; // 更新當前位的值為計算結果的個位carry = current / 10; // 更新進位}if (carry != 0) {str = "1" + str; // 處理最終的進位}return str;
}int main() {string s;cin >> s; // 輸入十進制數vector<int> binary; // 用于存放二進制逆序的每一位while (s.size() != 0) {int last = s[s.size() - 1] - '0'; // 取最后一位binary.push_back(last % 2); // 將最后一位的余數(二進制的最低位)存入 vectors = divide(s, 2); // 將十進制數除以 2,得到下一輪迭代的數值}// 將得到的 binary 中的按位逆序排列的二進制數轉換為十進制數string res = "0"; // 初始化結果為 0for (int i = 0; i < binary.size(); i++) {res = multiple(res, 2); // 將結果乘以 2,相當于左移一位res = Add(res, binary[i]); // 加上當前位的值}cout << res << endl; // 輸出最終的二進制逆序數return 0;
}
提交結果:
?