codeup墓地 进制转换

  • Post author:
  • Post category:其他




题目描述

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



输入

多组数据,每行为一个长度不超过30位的十进制非负整数。

(注意是10进制数字的个数可能有30个,而非30bits的整数)



输出

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



样例输入

985

211

1126



样例输出

1111011001

11010011

10001100110



C++代码

#include<iostream>
#include<cstring>
using namespace std;
int main() {
	char in[35] = { 0 }, out[120] = { 0 };
	while (cin >> in) {
		int l = strlen(in);
		int sum = 1, size = 0;
		while (sum) {//记录每次整除2结果的各位数字和,当所有数字都为0时结束循环
			sum = 0; 
			//核心思想还是短除法倒序取余
			for (int i = 0; i < l; i++) { 
				int n = in[i] - '0';
				int d = n / 2;
				sum += d;
				in[i] = d + '0';
				if (i < l - 1) {
					in[i + 1] += n % 2 * 10;
				}
				if (i == l-1) {
					out[size++] = n % 2 + '0';
				}
			}
		}
		for (int k = strlen(out) - 1; k >= 0; k--) {
			cout << out[k];
		}
		cout << endl;
		//存储数组重置初值0
		memset(in, 0, sizeof(in));
		memset(out, 0, sizeof(out));
	}
	return 0;
}

用STL的写法

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

int main() {
	string s;
	while(cin >> s){
		vector<int> v;
		for(int i = 0; i < s.length(); i++){
			int n = s[i] - '0';
			v.push_back(n);
		}
		int sum;
		stack<int> st;
		do{
			sum = 0;
			for(int i = 0; i < v.size(); i++){
				int x = v[i] % 2;
				v[i] /= 2;
				sum += v[i];
				if(i < v.size() - 1){
					v[i+1] +=  x * 10;
				}else{
					st.push(x);
				}
			}
		}while(sum);
		//逆序输出
		while(!st.empty()){
			cout << st.top();
			st.pop();
		}
		cout << endl;
	}
	return 0;
}



版权声明:本文为LoveHYZH原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。