【HDOJ 2031】 进制转换

来源:互联网 发布:质谱软件 编辑:程序博客网 时间:2024/06/06 19:20
Problem Description
输入一个十进制数N,将它转换成R进制数输出。
 

Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
 

Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
 

Sample Input
7 223 12-4 3
 

Sample Output
1111B-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;}


0 0