任意进制之间的转换
原创:
之前有发一篇进制转换的文章,转换思想在里面,这里不再重复,详情请查看:http://www.cnblogs.com/numen-fan/p/6495009.html
题目描述: 求任意两个不同进制非负整数的转换(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 提示: 可以用字符串表示不同进制的整数。
代码:
//任何进制的转换
void test3(){
//输入格式,a,n,b;将a进制的n转为b;
int a,b;
char str[40];//保存n
while (scanf("%d%s%d",&a,str,&b)!=EOF) {
int tmp = 0,lenth = strlen(str),c=1;//tmp表示将a进制数n转为10进制,len为字符串n的长度,c为权重默认为1,最低位嘛,待会转10进制时使用
for (int i = lenth-1; i>=0; i--) {
int x;
if (str[i]>='0'&&str[i]<='9') {
x = str[i]-'0';
}else if(str[i]>='a'&&str[i]<='z'){
x = str[i]-'a'+10;
}else if(str[i]>='A'&&str[i]>='Z'){
x = str[i]-'A'+10;
}
tmp+=x*c;//转为10进制,乘权重
c*=a;//增加权重;
}
char ans[40],size = 0;
do{
int x = tmp%b;//将10进制转为b进制
ans[size++] = x<10?x+'0':x-10+'A';//进行结果的装填
tmp/=b;
}while(tmp);
// puts(ans);这里不能这样用,因为ans为正确顺序的倒着的
for(int i = size-1;i>=0;i--){
printf("%c",ans[i]);
}
printf("\n");
}
}