zoukankan      html  css  js  c++  java
  • 进制转换 -- 牛客

    题目描述

    将一个长度最多为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 }
  • 相关阅读:
    了解运行时类型信息(RTTI)
    linux培训笔记1
    Delphi 的各种错误信息(中英文)
    delphi XML 原来可以玩接口
    wxWidgets初学者导引(2)——下载、安装wxWidgets
    Delphi中ADO异步执行方式
    模态运行EXE程序
    window.setTimeout()函数的使用
    应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
    Dll方式的线程,需要引用这个
  • 原文地址:https://www.cnblogs.com/jiashun/p/newcode21.html
Copyright © 2011-2022 走看看