算法笔记练习 3.5 进制转换 问题 C: 进制转换

算法笔记练习 题解合集

本题链接

题目

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

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

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

样例输入

985
211
1126

样例输出

1111011001
11010011
10001100110

思路

很久以前写的代码了…没想到那个时候就很丑陋地实现了大整数除法哈哈哈哈 ~ 如果觉得难的话可以等学过算法笔记 5.6 大整数运算 这一节之后再回头写这个题。

思路就是用数组来存放输入的大整数,然后不断地让这个数组除以 2,把过程中得到的余数依次保存下来,最后反向输出即可。具体实现见代码。

代码

#include 
#include 
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;
} 

你可能感兴趣的:(算法笔记)