【题目描述】
用递归算法将一个十进制数X转换成任意进制数M(M≤16)。
【输入】
一行两个数,第一个十进制数X,第二个为进制M。
【输出】
输出结果。
【输入样例】
31 16 {将十进制31转化为十六进制数}
【输出样例】
1F
【思路】
转进制这道题出自一本通的函数递归题集,目的是让我们用递归的方法进行解答,本题将用递归和普通函数两种方法进行解答,具体思路已写在注释当中。
【方法1:递归】
/* 1161 转进制
思路:用递归法将十进制数转换为任意m(<=16)进制的数
递归终止条件(基例):n=0时,不用再输出n和m的余数,否则继续输出
递归链条:参数每次都是按照n/m进行变化的
*/
#include <iostream>
using namespace std;
string b = "ABCDEF"; //用字符串b存储超过十进制的字母
int m; //m进制的基数
void f(int n){ //进制转换函数
int d = n % m; //取得n和m的余数
if(n == 0) return; //递归的基例
f(n/m); //递归的链条
if(d<10){ //当余数小于10时,说明转换的是小于或等于十进制的数
cout<<d; //原样输出
}
else{ //否则说明转换的是大于十进制的数
cout<<b[d-10];
}
}
int main(){
int n;
cin>>n>>m;
f(n);
return 0;
}
【方法2:字符串】
#include <iostream>
#include <string>
using namespace std;
string s; //用于存储转换进制后的数
string a = "ABCDEF"; //大于十进制的进制数码
string b = "0123456789"; //十进制以内的进制数码
int m; //m进制的基数
void f(int n){ //进制转换函数
while(n){ //当n不为0时,将每次的余数存储至s中
int d = n % m;
//判断d是否大于10(说明转换的是大于十进制的数)
if(d > 10){
s.push_back(a[d-10]); //将字母添加至s中
}
else{ //否则说明转换的是小于或等于十进制的数
s.push_back(b[d]); //将数字添加至s中
}
n /= m; //n每次要除以m
}
}
int main(){
int n;
cin>>n>>m;
f(n);
for(int i=s.size()-1;i>=0;i--) //倒序输出字符串s
cout<<s[i];
return 0;
}
以上是笔者的两种思路,欢迎大家交流讨论。