1、 题目分析
本次上机题目是把一个十进制数n转换成b进制数(2<=b<=16),要求用递归算法和非递归算法两种方式解决问题,分析题目可知,十进制数转任一进制所用方法都是模以所转进制的数字再取余,直到所取余数为零结束。
2、算法设计
r代表n%k的余数,n是输入的十进制数,k是要转换的进制
递归出口 n==0
递归体 r=n%k; n=n%k
3、源程序
递归方法
#include<iostream>
using namespace std;
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int Change(int n, int k) //递归方法实现十进制数n转换为k进制数
{
int r=0;
r = n%k;
n = n/k;
if(n!=0) //递归体,n=0是递归出口
{
Change(n,k);
}
printf("%c",d[r]);
}
int main()
{
int x, m;
cout<<"请输入非负十进制数:"<<endl;
cin>>x;
cout<<"请输入要转换的进制:"<<endl;
cin>>m;
Change(x,m);
return 0;
}
非递归方法
#include<iostream>
using namespace std;
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char a[100];
int Change(int n,int k) //非递归方法实现十进制数n转换为k进制数
{
int r = 0;
while(n!=0)
{
a[++r] = n%k;
n = n/k;
}
for(int j=r;j>=1;--j) //倒序输出余数
printf("%c",d[a[j]]);
}
int main()
{
int x, m;
cout<<"请输入非负十进制数:"<<endl;
cin>>x;
cout<<"请输入要转换的进制:"<<endl;
cin>>m;
Change(x,m);
return 0;
}
4、运行结果截图
递归方法运行结果
非递归方法运行结果;