筷子与饺子
Published on 2019-11-11 04:08 in 暂未分类 with 筷子与饺子

进制转换 -- 牛客

题目描述

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

输入描述:

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

输出描述:

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

输入

0
1
3
8

输出

0
1
11
1000

解题思路

这是一道关于大数整数的处理,对于长度为30的整数,我们采用字符串的形式进行存储。

首先我们回想一下,在将十进制数转化为二进制数的时候的做法,采用的是 “除2取余,逆序排列” 的做法:

 

 那么很显然,我们需要一个数组来存放余数,或者可以使用一个栈实现逆序排列;

 问题就转化成可如何求这个大数除2的余数。对于一个数来说,其对2的余数只取决于它的末位,即其末位对2的余数;

 所以我们必须存储每一次 除以2的商,并且取其末位进行取余。

 最后将余数逆序输出即可,另外需要注意的是,每一次处理的数都是字符型。 


 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     char s[31];
 9     while(cin>>s)
10     {
11         int carry = 0; //进位位;
12         int index  = 0;
13         int zero_num = 0;
14         char t[10000];
15         int len = strlen(s);
16 
17         while(1)
18         {
19             zero_num=0;
20             t[index++] = (s[len-1]-'0')%2 + '0';
21             for(int i=0;i<len;i++)
22             {
23                 carry = (s[i]-'0')%2;   //按照10进制竖式除法,先从高位除起
24                 s[i] = (s[i]-'0')/2 + '0';  //保存高位的商 即竖式除法上面的数字
25                 s[i+1] = carry*10 +  s[i+1];
26                 if(s[i]=='0') zero_num++;
27             }
28             if(zero_num == len) break;
29         }
30         for (int i=index-1;i>=0;i--)
31         {
32             cout << t[i];
33         }
34         cout << endl;
35     }
36 }

 

posted @ 2019-09-02 15:48  筷子与饺子  阅读(...)  评论(...编辑  收藏