您的位置:首页 > 其它

poj1220

2016-07-27 21:57 204 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息