/* 求任意两个不同进制非负整数的转换,所给整数在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 输出: 210306 提示:可以用字符串表示不同进制的整数 思路: a->10->b a进制先转换为10进制,利用各位依次乘以10的0次方,1次方,。。。.10进制转换为进制,利用除k取余法。 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]) { long a,b; char n[20]; while(EOF!=scanf("%d %s %d",&a,n,&b)) { long lSum = 0; for(int i = 0 ; n[i]!='\0' ; i++ ) { //关键还需要将a转换为10 int x; if(n[i] <= 'z' && n[i] >= 'a') { x = n[i] - 'a' + 10; } else if(n[i] <= 'Z' && n[i] >= 'A') { x = n[i] - 'A' + 10; } else if(n[i] <= '9' && n[i] >= '0') { x= n[i] - '0'; } //lSum += lSum*a + x;//易错,这里不是lSum +=,而是lSum = lSum = lSum*a + x; //printf("%ld",lSum); } printf("%ld\n",lSum); //接下来将10进制数转换为b进制数,采用除b取余的方法 int iBit[20],j = 0; char sBit[20]; do{ //iBit[j++] = lSum % b;//易错,这边还需要将超过10的数字转换为字符,所以不管数字和字符统一用字符表示 iBit[j] = lSum % b; sBit[j] = iBit[j] < 10 ? (iBit[j] + '0') : (iBit[j] - 10 + 'A'); lSum /= b; j++; }while(lSum); sBit[j] = '\0'; //逆序打印 j--; for(; j >= 0 ; j--) { printf("%c",sBit[j]); } } system("pause"); getchar(); return 0; }