总体思路:当要求十进制x的k进制表示时,我们只需要不断重复地把x对k求余,再除以k,即可得到由低到高的各个位数上的数
当要求得由k进制表示得数字得十进制时,我们需要依次计算各个数位上的数字与该位权重的积(第n位的权重为k^(n-1)),
然后将它们依次累加即可得到该十进制值
题目描述
求任意两个不同进制非负整数的转换(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
1 #include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 int a,b,c; 7 char str[40],ans[40]; 8 int i; 9 int temp,len,index; 10 int x; 11 12 while( scanf("%d%s%d",&a,str,&b)!=EOF) 13 { 14 len = strlen(str); 15 temp = 0; //表示十进制数,初始化为0 16 c = 1; //c表示各个数位的权重,初始化为1 17 index = 0; //表示目标数组中的位置 18 for( i=len-1; i>=0; i--) 19 { 20 //注意这里是从后往前循环 21 if( str[i]>=‘0‘ && str[i]<=‘9‘) 22 x = str[i] - ‘0‘; 23 else if( str[i]>=‘a‘ && str[i]<=‘z‘) 24 x = str[i] - ‘a‘ + 10; 25 else if( str[i]>=‘A‘ && str[i]<=‘Z‘) 26 x = str[i] - ‘A‘ + 10; 27 temp += x*c; 28 c *= a; 29 } 30 do 31 { 32 //即使转换数值为0也会执行一遍 33 x = temp%b; 34 if( x<10 ) ans[index++] = x + ‘0‘; 35 else ans[index++] = x-10 + ‘A‘; 36 temp/=b; 37 } 38 while( temp); 39 for( i=index-1; i>=0; i--) 40 { 41 //输出时顺序从高位到低位 42 printf("%c",ans[i]); 43 } 44 printf("\n"); 45 } 46 return 0; 47 }