题目描述
求任意两个不同进制非负整数的转换(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)。
样例输入
样例输出
提示 [+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
来源
【思路】


- /*********************************
- * 日期:2013-2-19
- * 作者:SJF0115
- * 题号: 天勤OJ 题目1130: 数制转换
- * 来源:http:///problem.php?id=1130
- * 结果:AC
- * 来源:2008年北京大学图形实验室计算机研究生机试真题
- * 总结:
- **********************************/
- #include <string.h>
- #include <stdio.h>
-
- char str[1001];
- char ans[1001];
- /*
- * 转换为十进制
- * str是a进制数字
- */
- long long int ToD(int a){
- int c,len,i;
- long long int sum,w;
- len = strlen(str);
- //转换为十进制的数字
- sum = 0;
- //权值
- w = 1;
- //从低位到高位遍历每一个数字
- for(i = len-1;i >= 0;i--){
- //0 - 9
- if(str[i] >= '0' && str[i] <= '9'){
- c = str[i] - '0';
- }
- //A - F
- else if(str[i] >= 'A' && str[i] <= 'F'){
- c = str[i] - 'A' + 10;
- }
- //a - f
- else{
- c = str[i] - 'a' + 10;
- }
- //累加该位数字和该位数字的权值的积
- sum += c * w;
- //进制权值
- w *= a;
- }
- return sum;
- }
- /*
- * 十进制数字num转换为b进制数字,并用ans存储
- */
- int ToAny(long long int num,int b){
- int index = 0,c;
- do{
- //计算该位数字
- c = num % b;
- //将数字转换为字符
- ans[index++] = (c < 10) ? (c + '0') : (c - 10 + 'A') ;
- num /= b;
- }while(num);
- return index;
- }
- int main()
- {
- long long int c;
- int len,a,b,i;
- while(scanf("%d %s %d",&a,str,&b) != EOF){
- //转换为十进制
- c = ToD(a);
- //转换为b进制
- len = ToAny(c,b);
- //输出
- for(i = len-1;i >= 0;i--){
- printf("%c",ans[i]);
- }
- printf("\n");
- }
- return 0;
- }
|