【C++】已通过

核心思路:

  1. 首先写出string模拟人工计算的乘2,除2,的函数mul和div,返回值用string返回
  2. 利用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;
}