HDU2031 进制转换进制

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2031 进制转换进制相关的知识,希望对你有一定的参考价值。

进制转换
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 94839 Accepted Submission(s): 51238

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

Author
lcy

Source
C语言程序设计练习(五)

问题链接HDU2031 进制转换
问题简述:(略)
问题分析
  按Markdown格式重写了题解,旧版题解参见参考链接。
  题意中已经明确指出,整数是32位的,所以存放结果的字符数组的长度取32+2即可。因为二进制数的字符长度最长,考虑符号位和字符串结束符。
  解法一:通用转换函数
  编写通用的10进制转B进制函数convert()来实现,其中好包括了逆序函数reverse()。这种做法的好处是,所写的函数可以复用。
  解法二:递归处理
  采用递归处理也是一种方法。因为,使用模除(取余数)运算,顺序取出最低位,需要逆序输出才可以。递归函数有压堆栈的功能,实现逆序是方便的。
  解法三:直接转换
  直接转换处理并且输出,程序代码更加简洁。用一个表digits[],将每一位的数字值转换为字符,使得程序代码更加简洁。因为最大进制是16进制,每一位的数字值最大为’F’。
  N为0的情况,似乎有必要特殊处理一下。
程序说明:(略)
参考链接HDU2031 进制转换【进制】
题记:(略)

AC的C语言程序(解法三:直接转换)如下:

/* HDU2031 进制转换 */

#include <stdio.h>
#include <stdlib.h>

char digits[] = "0123456789ABCDEF";
#define N 32
char ans[N + 2];

int main()
{
    int n, r;
    while (~scanf ("%d%d", &n, &r)) {
        if (n < 0) {printf("-"); n = -n;}
        int i = 0;
        while (n) ans[i++] = digits[n % r], n /= r;
        if (i == 0) ans[i++] = '0';

        /* 输出结果 */
        while (--i >= 0) putchar(ans[i]);
        putchar('\\n');
    }

    return 0;
}

AC的C语言程序(解法二:递归处理)如下:

/* HDU2031 进制转换 */

#include <stdio.h>
#include <stdlib.h>

char digits[] = "0123456789ABCDEF";

void convert (int n, int r)
{
    if (n > r) convert(n / r, r);
    printf("%c", digits[n % r]);
}

int main()
{
    int n, r;
    while (~scanf ("%d%d", &n, &r)) {
        if (n < 0) {printf("-"); n = -n;}
        convert(n, r);
        printf("\\n");
    }

    return 0;
}

AC的C语言程序(解法一:通用转换函数)如下:

/* HDU2031 进制转换 */

#include <stdio.h>
#include <string.h>

#define N 32
char ans[N + 2];

void reverse(char s[], int len)
{
    int i, j, temp;
    for (i = (s[0] == '-' ? 1 : 0), j = len - 1; i < j; i++, j--)
        temp = s[i], s[i] = s[j], s[j] = temp;
}

void convert(int n, int r, char s[])
{
    int i = 0;
    if (n < 0) s[i++] = '-', n = -n; /* 处理负数 */
    while (n) {
        s[i] = n % r;
        if (s[i] >= 10) s[i] += 'A' - 10;
        else s[i] += '0';
        n /= r;
        i++;
    }
    s[i] = '\\0';

    reverse(s, i);
}

int main(void)
{
    int n, r;
    while (scanf("%d%d", &n, &r) != EOF) {
        convert(n, r, ans);
        printf("%s\\n", ans);
    }

    return 0;
}

以上是关于HDU2031 进制转换进制的主要内容,如果未能解决你的问题,请参考以下文章

HDU2031 进制转换进制

HDU 2031 进制转换

HDU 2031 进制转换

HDU 2031 进制转换

HDU2031 进制转换

hdu 2031 进制转换(栈思想的使用)