题目描述:
求任意两个不同进制非负整数的转换(二进制到十六进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)
输入:
输入包含多组测试数据。每组输入占一行,包含3个整数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
样例输出
201306
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
char ans[20];
long str2int(long a,char str[]){
int i;
long n=0;
int k=strlen(str);
for(i=0;i<k;i++){
if(str[i]<='Z'&&str[i]>='A')
str[i]+=32;
}
for(i=0;i<k;i++){
if(str[i]>=48&&str[i]<=57)
n+=pow(a,k-1-i)*(str[i]-48);
else
n+=pow(a,k-1-i)*(str[i]-87);
}
return n;
}
int hex(long b,long n){
int i=0;
do{
if(n%b>=0&&n%b<=9)
ans[i++]=n%b+48;
else
ans[i++]=n%b+87;
n=n/b;
}while(n);
return i;
}
void print(char str[],int k){
do{
printf("%c",ans[k-1]);
}while(--k);
}
int main(){
long a,b,n;
int k;
char str[20],strtemp[20];
while(scanf("%d%s%d",&a,str,&b)!=EOF){
n=str2int(a,str);
k=hex(b,n);
print(ans,k);
}
}