代码练习系列:问题 C 进制转换【转载】
2017-11-08 18:39
204 查看
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
思路:
十进制数位数超过30位,数太大。用字符数组来存放。转换为二进制时,每一次数组最后一位取余存入新数组,然后十进制数从第一位开始,判断当前是奇数还是偶数,奇数则下一位的进位为10,偶数则为0,然后加上前一次求得的进位位(一开始设为0)再除以二,。
相当于连续除以二求余
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
思路:
十进制数位数超过30位,数太大。用字符数组来存放。转换为二进制时,每一次数组最后一位取余存入新数组,然后十进制数从第一位开始,判断当前是奇数还是偶数,奇数则下一位的进位为10,偶数则为0,然后加上前一次求得的进位位(一开始设为0)再除以二,。
相当于连续除以二求余
#include <stdio.h> #include <string.h> int main(){ char n[40], buf[200]; int num[40], len, i, len_str, c, tmp, j; while (scanf("%s", n) != EOF){ for (len = 0; n[len]; len++){ num[len] = n[len] - '0'; } i = 0, len_str = 0; while (i < len){ buf[len_str++] = num[len - 1] % 2 + '0'; c = 0; for (j = i; j < len; j++){ tmp = num[j]; num[j] = (num[j] + c) / 2; if (tmp & 1){//二进制位与运算,判断tmp是否为奇数 c = 10; } else c = 0; } if (num[i] == 0) i++; } for (int j = len_str - 1; j >= 0; j--){ printf("%c", buf[j]); } printf("\n"); } return 0; }
相关文章推荐
- 代码练习系列:问题 C 等腰梯形
- 代码练习系列:问题 B Hello World for U
- 代码练习系列:问题 A 日期差值
- 代码练习系列:问题 A 又一版 A+B
- 代码练习系列:问题 D 八进制
- 代码练习系列:问题 B Day of Week
- 代码练习系列:问题 A 输出梯形
- 代码练习系列:问题 B 数制转换
- 代码练习系列:问题 A 统计同成绩学生人数
- 代码练习系列:问题 G 数字分类 (20)
- 代码练习系列:问题 A 字符串连接
- 代码练习系列:问题 E 日期累加
- 代码练习系列:问题 F A+B和C (15)
- 代码练习系列:问题 H 部分A+B (15)
- 代码练习系列:问题 E 学生查询
- 代码练习系列:问题 C 打印日期
- 【转载】:【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题
- 艾伟_转载:ASP.NET Forms验证的安全性问题研究——为什么加密代码需要配置为服务
- Android View系列代码问题(一)
- 算法竞赛入门经典,练习代码 ,4.4.1 小问题集锦