【C++】已通过
核心思路:
- 首先写出string模拟人工计算的乘2,除2,的函数mul和div,返回值用string返回
- 利用div可以将10进制s化成二进制bin_s,然后利用mul将bin_s化成s,解决。
注意:转换过程中,注意字符串的正逆序。
#include<string>
#include<algorithm>
using namespace std;
//对s加1
string sadd(string &s) {
if (s == ""){
s="1";
return "1";
}
int carry = 1;
int index = s.size()-1;
while (carry != 0) {
if (index == 0) {
if (s[index] - '0' + carry <= 9) {
s[index] = s[index] + carry;
}
else {
s[index] = '0';
s.insert(0, "1");
}
carry = 0;
}
else {
if (s[index] - '0' + carry <= 9) {
s[index] = s[index] + carry;
carry = 0;
}
else {
s[index] = '0';
carry = 1;
}
}
index--;
}
return s;
}
//对s乘以2
string mul(string &s) {
if (s == ""){
s="0";
return "0";
}
int carry = 0;
for (int i = s.size() - 1; i >= 0; i--) {
if (i == 0) {
if ((s[i] - '0') * 2 + carry < 10) {
s[i] = (s[i] - '0') * 2 + carry + '0';
carry = 0;
}
else {
s[i] = (s[i] - '0') * 2 + carry - 10 + '0';
s.insert(0, "1");
}
}
else {
if ((s[i] - '0') * 2 + carry < 10) {
s[i] = (s[i] - '0') * 2 + carry + '0';
carry = 0;
}
else {
s[i] = (s[i] - '0') * 2 + carry - 10 + '0';
carry = 1;
}
}
}
return s;
}
//对s除以2
string div(string &s) {
if (s == ""){
s="0";
return "0";
}
int carry = 0;
for (int i = 0; i < s.size(); i++) {
if ((s[i] - '0')% 2 == 1) {
s[i] = (s[i] - '0') / 2 + carry + '0';
carry = 5;
}
else {
s[i] = (s[i] - '0') / 2 + carry + '0';
carry = 0;
}
}
while (s[0] == '0') {
s.erase(0, 1);
}
return s;
}
//将二进制转成十进制string
string bin_to_oct(string bin_s) {
if (bin_s == "")return "0";
//首先对bin_s进行去0
while (bin_s[0] == '0') {
bin_s.erase(0, 1);
}
string s="";
int index = 0;
for(;index<bin_s.size();index++){
//cout << "执行循环第" << index << "次" << endl;
if (bin_s[index] == '1') {
//cout << "窗口01,s=" <<s<< endl;
sadd(s);
}
else if (bin_s[index] == '0') {
//cout << "窗口02,s=" << s << endl;
//什么都不需要做
}
else {
cout << "错误01" << endl;
}
if (index != bin_s.size() - 1)mul(s);
}
return s;
}
void test() {
string s = "100";
cout << bin_to_oct(s) << endl;
cout << "-------------------" << endl;
}
int main() {
//test();
string s; cin >> s;
string bin_s;//二进制数字
int i = 0;
while (s != "") {
bool ret = ((s[s.size() - 1] - '0') % 2 == 1);
if (ret) {//除不尽
bin_s += "1";
}
else {
bin_s += "0";
}
div(s);
}
cout << bin_to_oct(bin_s) << endl;
/*reverse(bin_s.begin(), bin_s.end());
cout << bin_s << endl;*/
return 0;
}