问题链接:CCF NOI1076 进制转换。
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
用递归算法将一个十进制数X(1<=X<=10^9)转换成任意进制数M(2<=M<=16)。
输入
一行两个正整数X和M。
输出
输出X的M进制的表示。样例输入
21 16
样例输出
1F
数据范围限制
提示
问题分析
这是一个进制问题。
题目要求用递归实现。递归实现比起递推实现速度上慢,而且耗费程序的堆栈空间。
用进制的基数(例如:10进制的基数为10)取余数计算可以获得数的最低位,除以进制的基数则相当于右移1位(扔掉最低位)。重复取余数和做除法,可以顺序得到一个数的从低位到高位。
需要注意的是,输出一个数要先输出高位,再输出低位。
函数convert()用于将数转换为给定的进制。
这里给出递归和非递归两种程序。
要点详解
- C语言程序中,从重用性考虑,尽量将功能封装到函数中。
参考链接:(略)。
100分通过的C语言程序(非递归):
#include <stdio.h>
#define N 100000000
char a[N];
void convert(int n, int base)
{
int i;
i = 0;
while(n) {
a[i] = n % base;
if(a[i] >= 10)
a[i] = 'A' + a[i] - 10;
else
a[i] += '0';
i++;
n /= base;
}
i--;
while(i>=0) {
printf("%c", a[i]);
i--;
}
printf("\n");
}
int main(void)
{
int x, m;
scanf("%d%d", &x, &m);
convert(x, m);
return 0;
}
100分通过的C语言程序(递归):
#include <stdio.h>
void convert(int n, int base)
{
char digit;
if(n) {
convert(n / base, base);
digit = n % base;
if(digit >= 10)
digit = 'A' + digit - 10;
else
digit += '0';
printf("%c", digit);
}
}
int main(void)
{
int x, m;
scanf("%d%d", &x, &m);
convert(x, m);
printf("\n");
return 0;
}