Problem Link:点击打开链接
题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。 不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
输入描述:
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。 数据可能存在包含前导零的情况。
输出描述:
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
输入例子:
15 Aab3 7
输出例子:
210306
AC code:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<math.h>
#include<string.h>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define exp 1e-9
#define MAXN 1000010
using namespace std;
char n2ch[17]="0123456789ABCDEF";
int ch2n[128]={0};
void init()
{
int i;
for(i=0;i<10;++i)
{
ch2n[i+'0']=i;
}
for(i=0;i<=5;++i)
{
ch2n['a'+i]=i+10;
ch2n['A'+i]=i+10;
}
}
LL Str2num(char str[],int n)
{
LL s,t;
int i,len;
len=strlen(str);
s=0;
t=1;
for(i=len-1;i>=0;--i)
{
s+=ch2n[str[i]]*t;
t*=n;
}
return s;
}
char *Num2str(LL n,int b,char tmp[])
{
char s[111];
int i,len;
s[0]=0;
i=0;
while(n)
{
s[i++]=n2ch[n%b];
n/=b;
}
if(i==0)
{
s[1]='\0';
tmp[0]='0';
tmp[1]='\0';
}
else
{
s[i]='\0';
len=i;
for(i=0;i<len;++i)
{
tmp[i]=s[len-1-i];
}
tmp[i]='\0';
}
return tmp;
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
int a,b;
char s[111];
int n;
LL num;
char str[111];
init();
while(scanf("%d%s%d",&a,&s,&b)!=EOF)
{
num=Str2num(s,a);
// printf("%lld\n",num);
Num2str(num,b,str);
puts(str);
}
return 0;
}