Problem Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2 23 12 -4 3
Sample Output
111 1B -11
AC代码:
#include <stdio.h> #include <math.h> #include <string.h> #define LEN strlen(str) int main() { int n,r,i,m; char str[20]; while (~(scanf("%d%d",&n,&r))){ memset(str,0,sizeof(str)); m = fabs(n); for (i = 0;m;i++){ if ((str[i]=m%r) == 10) str[i] = 'A'; else if ((str[i]=m%r) == 11) str[i] = 'B'; else if ((str[i]=m%r) == 12) str[i] = 'C'; else if ((str[i]=m%r) == 13) str[i] = 'D'; else if ((str[i]=m%r) == 14) str[i] = 'E'; else if ((str[i]=m%r) == 15) str[i] = 'F'; else str[i] = m%r + '0'; m /= r; } if (n < 0) putchar('-'); for (i = LEN-1;i >= 0;--i) putchar(str[i]); putchar('\n'); } return 0; }
A better version:
#include <iostream> using namespace std; int main(){ char str[17]="0123456789ABCDEF";//用一个字符型数组存好"0123456789ABCDEF"【巧妙】 int n,m,i,j; int r[20]; while(~scanf("%d%d",&n,&m)){ i = 0; if(n < 0){//如果n<0,则输出负号,然后把n变成整数 printf("-"); n = -n; } while(n){//用除R取余法模拟,并把余数放到数组里面 r[i] = n%m; n /= m; i++; } for(j = i-1;j >= 0;j--) printf("%c",str[r[j]]); printf("\n"); } return 0; }