进制转换(清华复试上机)

前言:

21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。

题目描述:

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

输入描述

多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)

输出描述:

每行输出对应的二进制数。

解答

#include<iostream>
#include<string>
using namespace std;

string div_2(string str) {
    
    							//对字符串除以2
	int temp;
	bool flag;										//每位除以2的余数标志
	if ((str[0] - '0') % 2 != 0)					//对于第一位的初始处理
		flag = true;
	else 
		flag = false;
	str[0] = (str[0] - '0') / 2 + '0';
	for (int i = 1; i < str.length(); i++) {
    
    
		temp = str[i] - '0';
		if (temp % 2 == 0) {
    
    
			if (flag)
				str[i] = (10 + str[i] - '0') / 2 + '0';
			else
				str[i] = (str[i] - '0') / 2 + '0';
			flag = false;
		}
		else {
    
    
			if (flag)
				str[i] = (10 + str[i] - '0') / 2 + '0';
			else
				str[i] = (str[i] - '0') / 2 + '0';
			flag = true;
		}
	}
	return str;
}

int cal_str(string str) {
    
    						//计算字符串的值
	int weight = 1;
	int res = 0;
	for (int i = str.length() - 1; i >= 0; i--) {
    
    
		res += (str[i] - '0') * weight;
		weight *= 10;
	}
	return res;
}
int main() {
    
    
	string str;
	while (cin >> str) {
    
    
		string Bnum = "";
		string prostr = str;
		while (cal_str(str) != 0) {
    
    
			if ((str[str.length() - 1] - '0') % 2 == 1) {
    
    
				str[str.length() - 1] -= 1;					//保证字符串传入函数时末尾为偶数
				Bnum += '1';
			}
			else
				Bnum += '0';
			str = div_2(str);
		}
		for (int i = Bnum.length() - 1; i > 0; i--)
			cout << Bnum[i];
		cout << Bnum[0] << endl;
		}
	return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44897291/article/details/113111293