题目描述
求任意两个不同进制非负整数的转换(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)。
示例1
输入
15 Aab3 7
输出
210306
解题思路:
- 先转为十进制,再转为其他进制
- 将要用到的字符串长度赋给一个单独的变量,防止用strlen(str)时,因为变动了一个字符,导致strlen(str)发生变化。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int c2n(char c){
if(c>='A'&&c<='Z'){
return c-'A'+10;
}
else if(c>='a'&&c<='z'){
return c-'a'+10;
}
else{
return c-'0';
}
}
char n2c(int c){
if(c<=9){
return c+'0';
}
else{
return c+'A'-10;
}
}
int main(){
int m,n,len,i,na;
long long int num,tmp;
char array[100];
while(scanf("%d %s %d",&m,array,&n)!=EOF){
num=0;
na=strlen(array);
for(i=0;i<na;i++){
array[i]=c2n(array[i]);
num=num+array[i];
if(i<na-1){
num=num*m;}
}
if(num==0){
printf("%lld\n",num);
continue;
}
len=0;
while(num!=0){
array[len]=num%n;
num=num/n;
len++;
}
for(i=len-1;i>=0;i--)
{
array[i]=n2c(array[i]);
printf("%c",array[i]);
}
printf("\n");
}
return 0;
}
网友评论