1943 Problem C:进制转换

原创 2018年04月16日 16:08:05

题目描述

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

输入

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

输出

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

样例输入

985
211
1126

样例输出

1111011001
11010011
10001100110

思路:

本题中数字可能达到30位,远超于longlong型,所以只能用字符串对数字进行存储;

模拟十进制转二进制的手算过程,不断除基取余;

代码如下:

#include <cstdio>
#include <cstring>
 
char n[200], ans[200]; 
int num[200];

int main()
{
	while (scanf ("%s", n) != EOF) {
		int len = strlen (n);
		for (int i = 0; i < len; i++) {				//将字符转化为数字; 
			num[i] = n[i] - '0';
		}
		
		int carry, count = 0, j = 0;
		while (j < len) {
			ans[count++] = num[len - 1] % 2 + '0'; 			//通过最后一位值确定输出1还是0; 
			
			for (int i = j, carry = 0; i < len; i++) {
				int sum = (carry * 10 + num[i]) / 2;		//模拟进行除法; 
				carry = num[i] % 2;							//判断除2是否除尽; 
				num[i] = sum;
			}
			if (num[j] == 0)          j++;                           //最高位数字为0,下移一位;
		}
		
		for (int i = count - 1; i >= 0; i--) {				//数组从高位输出; 
			printf ("%c", ans[i]);
		}
		printf ("\n");
	}
	
 	return 0;
}   

关键点:

    for (int i = j, carry = 0; i < len; i++) {
		int sum = (carry * 10 + num[i]) / 2;		//模拟进行除法; 
		carry = num[i] % 2;				//判断除2是否除尽; 
		num[i] = sum;
	}
这道题目看了很久的代码才看懂,写一下自己的理解:

这段代码模拟除法从高位开始除2,当除不尽时,乘十加上下一位的值。

因为是用字符串存储,一个位置只存储了一位数字,所以用一个循环处理所有数字;

如若不理解可先手写一十进制数进行2进制的转换。


从这题学到while(~scanf ("%s", n)) 与 while(scanf ("%s", n) != EOF)等价;

scanf函数的返回值就为其成功读入的参数的个数,当读取文件到文件末尾导致无法读取时,函数会返回-1,C语言中EOF来代表-1;

 ~是取反,-1的补码为1111 1111 1111 1111,所以取反后正好为0,所以两种写法等价;

Codeup小白掉坑经验总结之 进制转换 id=1943 1950

Codeup小白掉坑经验总结之 进制转换 id=1943 1950 题目如下 1943: 进制转换 时间限制: 1 Sec 内存限制: 32 MB 题目描述 将一个长度最多为30位数字...
  • a845717607
  • a845717607
  • 2018-01-07 21:22:43
  • 271

1943 Problem C 进制转换

问题 C: 进制转换 时间限制: 1 Sec 内存限制: 32 MB 献花: 99 解决: 58 [献花][花圈][TK题库] 题目描述 将一个长度最多为30位数字的十进制非负整数转换为...
  • fantasydreams
  • fantasydreams
  • 2018-01-13 17:24:37
  • 31

oj题目回顾(1942)C语言习题5.19--进制转换

问题及代码 Description 输入一个十进制数N,将它转换成R进制数输出。 Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(210)。 ...
  • mcp3128
  • mcp3128
  • 2016-12-22 16:59:39
  • 371

C语言习题5.18--进制转换

题目描述 输入一个十进制数N,将它转换成R进制数输出。 输入 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2...
  • l769255844
  • l769255844
  • 2015-12-27 16:55:03
  • 1165

ZOJ Problem Set - 1002(DFS)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002题意:给出一个n,有n*n大小的城市,(.)表示空地,从碉堡(O)射出...
  • orange2a
  • orange2a
  • 2016-02-26 23:39:40
  • 570

Problem M: 递归函数--进制转换(十进制转二进制)

 Problem M: 递归函数--进制转换(十进制转二进制) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 521  Solved...
  • wzy_112099
  • wzy_112099
  • 2016-04-02 17:22:48
  • 696

poj 2273 An Excel-lent Problem 类进制转换

//poj 2273 //sep9 #include using namespace std; int r,c; char ans[128],ch; int sum[32]; int main() ...
  • sepNINE
  • sepNINE
  • 2015-11-18 23:54:31
  • 511

【HUSTOJ】1031: 进制转换

1031: 进制转换 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 78  Solved: 58 原题链接 Descript...
  • dearvee
  • dearvee
  • 2016-05-03 23:06:25
  • 208

1.1进制转换:十进制转为二进制

实例说明:进制转换方法有很多种,今天介绍一种十进制转二进制的算法。     技术要点:     将十进制数转换为二进制数的具体过程有以下几个要点。     (1)要用数组来存储每次对2取余的结果,所以...
  • LJ_King
  • LJ_King
  • 2016-05-03 19:46:21
  • 709

数据结构 使用递归任意进制转换(c语言实现)

#include void tran(int n,int d){ if(n==0){ return ; }else{ tran(n/d,d); if(d==16){ if(n%d>...
  • catkint
  • catkint
  • 2015-11-29 16:50:47
  • 3607
收藏助手
不良信息举报
您举报文章:1943 Problem C:进制转换
举报原因:
原因补充:

(最多只允许输入30个字)