算法笔记练习 题解合集
题目
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
思路
很久以前写的代码了…没想到那个时候就很丑陋地实现了大整数除法哈哈哈哈 ~ 如果觉得难的话可以等学过算法笔记 5.6 大整数运算 这一节之后再回头写这个题。
思路就是用数组来存放输入的大整数,然后不断地让这个数组除以 2,把过程中得到的余数依次保存下来,最后反向输出即可。具体实现见代码。
代码
#include <cstdio>
#include <cstring>
int main() {
char tempnum[40];
while (scanf("%s", tempnum) != EOF) {
int stack[150] = {0}; // 用来存放二进制数的栈
int *ps = stack; // ps 向栈中存取二进制数
// 把十进制数放到 int 数组 num 中,最后一位的后一项设为 -1
int num[40];
int i;
for(i = 0; i < strlen(tempnum); i++)
num[i] = tempnum[i] - '0';
num[i] = -1;
//开始进制转换
int *head = num; // head 和 tail 分别标注数组中十进制数最高位和最低位的位置
int *tail = &num[i - 1];
if (head == tail && *head == 0) { // 排除 0 的情况
printf("0\n");
continue;
}
while (head <= tail) { // head 在除以 2 的过程中不断靠近 tail,超过 tail 表示转换完成
//取余
*ps = (*tail) % 2;
ps++;
//除以2
int *temp = head; //辅助指针,只在除以2的时候用
int tenflag = 0; //用来标记是否出现借位
while (*temp != -1) {
*temp += 10 * tenflag;
if (*temp % 2)
tenflag = 1;
else
tenflag = 0;
*temp /= 2;
if (temp==head && *temp==0)
head++;
temp++;
}
}
while (ps != stack) {
ps--;
printf("%d", *ps);
}
putchar('\n');
}
return 0;
}