九度-1138-进制转换(char数组的使用)

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

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

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

样例输入:
0
1
3
8
样例输出:
0
1
11
1000
来源:
2008年北京大学软件所计算机研究生机试真题
解题心得
本题有几处需要反复复习留意的地方,在写其他算法题目时也要格外注意

  • 变量清空:在循环体外定义的变量使用时要格外小心,在循环处理数据时变量的值是该留还是该清,只有弄清楚了才能写出正确的程序,代码中while循环的idx1和last就进行了清零操作
  • c语言中的char数组赋值:对char数组按下标赋值时会出现字符串无意义的问题,对char某个索引直接赋值时又打印不出来。这是由于字符数组中默认以’\0’结尾,打印时读到’\0’就会结束。而直接赋值又使得字符数组没有结尾,也就没有意义。因此在赋值之后补上’\0’即可
//大数进制转换
#include<stdio.h>
#include<string.h>
using namespace std;
void divide(char str[])
{
	char *res = str;//字符串每次除2后的结果
	char ans[100];//每次余数作为二进制
	int idx1 = 0, idx2 = 0;//分别统计res和ans
	int last = 0, sum = -1;
	while (sum != 0)
	{
		idx1 = 0;
		last = 0;
		int len = strlen(res);
		for (int i = 0; i < len; i++)
		{
			int tmp = last * 10 + res[i] - '0';
			last = tmp % 2;
			res[idx1++] = tmp / 2 + '0';
		}
		last == 0 ? ans[idx2++] = '0' : ans[idx2++] = '1';
		ans[idx2] = '\0';
		sum = 0;
		for (int i = 0; i < idx1; i++)
		{
			sum = sum * 10 + (res[i] - '0');
		}
	}
	char *rev_ans = strrev(ans);
	for (int i = 0; i < strlen(rev_ans); i++)
	{
		printf("%c", rev_ans[i]);
	}
}
int main()
{

	char d[100];
	while (gets(d))
	{
		divide(d);
		getchar();//读取换行符
	}
	return 0;
}

当然代码中可能还会有一些bug或者可以优化的地方,欢迎大家在评论区指出,我们一起讨论,互相学习!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章