【学习笔记】〖九度OJ〗题目1138:进制转换

题目1138:进制转换

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:1002

解决:421

题目描述:

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

输入:

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

输出:

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

样例输入:
0
1
3
8
样例输出:
0
1
11
1000
来源:
2008年北京大学软件所计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7861-1-1.html
本题模拟手算进行大数除法,对大整数进行除二操作,将除法过程单独写为函数能让程序思路更清晰。


#include<iostream>
using namespace std;
 
char src[200]={0};
int srci[200] = {0};
char res[200]={0};
 
 
int devide(int len)
{
    int carry = 0;
    for (int i=0; i<len; i++)
    {
        int num = (carry*10 + srci[i]) / 2;
        carry = srci[i] % 2;
        srci[i] = num;
    }
    return carry;
}
 
//判断srci是否为0
bool isZero(int len)
{
    for (int i=len-1; i>=0; i--)
    {
        if (srci[i] != 0)
        {
            return false;
        }
    }
    return true;
}
 
int main()
{
     
    while (cin >> src)
    {
        int len=0, i=0, j=0;
        while (src[len]!='\0')
        {
            srci[len] = src[len] - '0';
            len++;
        }
 
        int resl = 0;
        do
        {
            res[resl++] = devide(len) + '0';
        }while (!isZero(len));
 
        for (i=resl-1; i>=0; i--)
        {
            cout << res[i];
        }
        cout << endl;
    }
    return 0;
}



posted @ 2014-03-08 21:08  神枪打麦手  阅读(1279)  评论(0编辑  收藏  举报