前言:
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;
}
}