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 进制转换进制的主要内容,如果未能解决你的问题,请参考以下文章