53 进制转换
问题描述 :
输入一个十进制数N,将它转换成R进制数输出。
输入说明 :
输入数据包含T个测试实例,每个测试实例包含两个整数N(32位整数,可为负数)和R(2<=R<=16, R<>10)。
输出说明 :
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
输入范例 :
20
-0 2
0 3
10 9
10 16
10 15
4763 9
23989 9
-1732 4
3339 5
6901 12
-1892 6
8836 11
12881 12
-21471 8
30350 7
16430 10
-24700 11
11042 14
1707 14
-20522 15
输出范例 :
0
0
11
A
A
6472
35814
-123010
101324
3BB1
-12432
6703
7555
-51737
154325
16430
-17615
404A
89D
-6132
解决思路:除数取余的方法解决进制转换问题。
遇到的具体问题:数字和数字字符的转换问题(想用更快捷的方法,不写过多if语句)。
采用ASCII码,但是ASCII码忘了。没关系自己找出两者之间的关系
//0-'0'=-48;
//10-A=-55
用编译器采用printf打印即可。
需要注意的是:负数转换为r进制时,首先输出“-”,然后将负数转换为正数,按照常规除数取余法即可
完整代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> char res[40]; int len=0; void Convert(int n,int r); char returnChar(int temp); int main(){ int n,r,t,i,j; scanf("%d",&t); for(i=0;i<t;i++){ scanf("%d %d",&n,&r); len=0; Convert(n,r); printf("%s\n",res); } return 0; } void Convert(int n,int r){ int temp; char ch; if(n==0){ res[len++]='0'; //printf("%d\n",n); }else if(n>0){ while(n){ temp = n%r; n=n/r; ch = returnChar(temp); res[len++]=ch; } }else{ printf("-"); n=n*(-1); while(n){ temp = n%r; n=n/r; ch = returnChar(temp); res[len++]=ch; } } int i;char theChar; for(i=0;i<len/2;i++){ theChar = res[i]; res[i] = res[len-1-i]; res[len-1-i] = theChar; } res[len]='\0'; } //0-'0'=-48; //10-A=-55 char returnChar(int temp){ char c; if(temp<10){ c = temp+48; }else{ c = temp+55; } return c; }