题目1138:进制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1461
解决:572
-
题目描述:
-
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
-
输入:
-
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
-
输出:
-
每行输出对应的二进制数。
-
样例输入:
-
0 1 3 8
-
样例输出:
-
0 1 11 1000
-
来源:
- 2008年北京大学软件所计算机研究生机试真题
-
- c++代码:
-
//1138 进制转换 #include<cstdio> #include<cctype> #include<cstring> #include<iostream> #include<memory.h> using namespace std; const int MAX = 110; #define SRE 10 #define TGT 2 inline void swap(int &x, int &y) { int t = x; x = y; y = t; } class node { public: //构造函数 node(char str[])//str数据 { memset(arr, 0, sizeof(arr)); len = strlen(str); for(int st=0; st<len; ++st) { arr[st] = str[st]-'0'; } revArr(); } //逆置 void revArr() { for(int i=0; i<len/2; ++i) { swap(arr[i],arr[len-i-1]); } } //打印 void nPrint() { int i; for(i=len-1; i>=0; i--) { printf("%d",arr[i]); } printf("\n"); } //除法 int operator / (const int x); int retLen() { return len; } private: int arr[MAX]; int len;//长度 }; int node::operator /(const int x) { int ret; bool flag = true;//高位是否存在可舍0 int s_len = len; for(int i=len-1; i>=0; --i) { if(i == 0) { ret = arr[i]%x; arr[i] /= x; } else { if(arr[i]<x) { arr[i-1] += arr[i]*SRE; arr[i] = 0; } else { arr[i-1] += (arr[i]%x)*SRE; arr[i] /= x; } } if(flag && arr[i]==0) { s_len--; } else if(arr[i]!=0) { flag = false; } else; } len = s_len; return ret;//返回余数 } int main(void) { char strs[MAX]; int count; int ans[MAX];//存储转换后 while(~scanf("%s", strs)) { if(strs[0]=='0' && strlen(strs)==1) { printf("0\n"); continue; } node ini = node(strs);//构造 count = 0; while(ini.retLen() > 0) { ans[count++] = ini / TGT; } for(int i=count-1; i>=0 ;--i) { printf("%d",ans[i]); } printf("\n"); } return 0; }