poj1220

Problem : NUMBER BASE CONVERSION

Description: 用0-9,A-Z,a-z这62个不同的数字和字母来表示不同进制的数,给出一个任意进制(62以内)的数,要求转换为指定进制的数。

Solution:刚开始看到这个我是想先把给出的数化成十进制,然后再由十进制转化为指定的进制,结果发现太麻烦了,我也觉得我实现不了。后来上百度才发现可以用除法解决。在这里为了方便,我举一个比较简单的例子。把十进制的12化成二进制表示,首先用1除以2,得到商是0,余数是1,然后用1乘以10(这里因为是十进制所以乘十)再加上2(12的个位数2),得到商为6,余数为0,这时候的余数存进另一个数组ans,因为这个余数就是我们要转化的二进制需要的那个余数。这时候06就存在了之前的那个存12的数组num里,我在这里有去掉前边多余的零;然后把6再去除以2,得到商为3,余数为0,把此时的余数存进ans数组;这时候num数组里是3,用3除以2,商为1,余数为1(余数1存进ans数组,商1存进num数组);最后用1除以2,商为0,余数为1;这时候num数组只有一个数而且为0,所以不用接着算了。这时候ans数组里为0011,倒序输出就得到了12的二进制了。

Code(C++):

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int num[1000];
int ans[1000];

int main()
{
    int N,length,r,t;
    int m,n,i,j,pos,s;
    string str;
    cin>>N;
    while(N--)
    {
        cin>>m>>n>>str;
        length=str.size();
        t=0,s=1;
        for(i=0; i<length; i++)
        {
            if(str.at(i)>='0'&&str.at(i)<='9')
                num[i]=str.at(i)-'0';
            else if(str.at(i)>='A'&&str.at(i)<='Z')
                num[i]=str.at(i)-'A'+10;
            else if(str.at(i)>='a'&&str.at(i)<='z')
                num[i]=str.at(i)-'a'+36;
        }
        memset(ans,0,sizeof(ans));
        while(!(s==0))
        {
            r=0;
            pos=0;
            for(j=0; j<length; j++)
            {
                int temp=num[j];
                num[pos++]=(r*m+temp)/n;
                r=(r*m+temp)%n;
            }
            ans[t++]=r;
            for(i=0;i<pos;i++)
                if(num[i]!=0)
                    break;
            s=0;
            for(;i<pos;i++)
                num[s++]=num[i];
            length=s;
        }
        cout<<m<<" "<<str<<endl;
        cout<<n<<" ";
        for(i=t-1; i>=0; i--)
            {
                if(ans[i]>=0&&ans[i]<=9)
                    cout<<char(ans[i]+'0');
                else if(ans[i]>=10&&ans[i]<=35)
                    cout<<char(ans[i]+'A'-10);
                else if(ans[i]>=36&&ans[i]<=61)
                    cout<<char(ans[i]+'a'-36);
            }
        cout<<endl;
        cout<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值