进制转换
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 53748 Accepted Submission(s): 29384
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
问题链接:HDU2031 进制转换。
问题简述:参见上文。
问题分析:(略)
程序说明:
题意中已经明确指出,整数是32位的,所有字符数组的长度取32+1即可。
本题还需要注意负数的处理!
这里给出两个版本的程序,一个使用指针实现,另外一个使用数组下标。
参考链接:I00028 整数逆序
题记:人们常用的是10进制,进制转换是常见的问题。
AC的C语言程序如下(数组):
/* HDU2031 进制转换 */
#include <stdio.h>
#include <string.h>
#define N 32
char ans[N + 1];
void reverse(char s[], int len)
{
int i,j;
int c;
for(i=(s[0]=='-'?1:0),j=len-1; i<j;i++,j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
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;
}
AC的C语言程序如下(指针):
/* HDU2031 进制转换 */
#include <stdio.h>
#include <string.h>
#define N 32
void reverse(char s[])
{
int i,j;
int c;
for(i=(s[0]=='-'?1:0),j=strlen(s)-1; i<j;i++,j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void convert(int n, int r, char *s)
{
char *t;
t = s;
// 处理负数
if(n<0) {
*t++ = '-';
n = -n;
}
while(n) {
*t = n % r;
if(*t >= 10)
*t = *t - 10 + 'A';
else
*t = *t + '0';
n /= r;
t++;
}
*t = '\0';
reverse(s);
}
int main(void)
{
int n, r;
char t[N + 1];
while(scanf("%d%d", &n, &r) != EOF) {
convert(n, r, t);
printf("%s\n", t);
}
return 0;
}