一、题目分析
将非负十进制整数n转换成b进制。(其中b=2~16)
基本要求:
1.完成题目,采用递归思想编程解决问题,要求设计出递归模型(递归出口和递归体的函数式)。
2.程序设计风格良好,实现功能测试代码,确保程序的健壮性。
3.画出递归树或者递归栈的调用过程。
4.实现非递归方法。
二、算法构造
1、递归算法
由题意可知,定义一个有两个参数的递归函数change(before,after)。其中,before表示需要进行转换的数字,after表示即将转换的进制。得到下面的递归公式:
change(before,after) = { change(0,after) before=0
change(before/after,after) before>0
利用求余数的方法来对应a[]数组的大小来求得相应的进制数,
2、非递归算法
依旧是利用求余数的方式相应转换进制,直到判断before<jz输出结束。
三、算法实现
#include<iostream>
#include<string.h>
using namespace std;
char a[]="0123456789abcdef";
//递归
void change(int before,int jz)
{
if(before=0)
{
return ;
}
else
{
change(before/jz,jz);
cout<<a[before%jz];
}
}
/*
//非递归
int Exchange(int before, int jz)
{
int p=1, y=0;
int remainder=0;
while (1)
{
remainder=before%jz;
before/=jz;
y+=remainder*p;
p*=10;
if(before<jz)
{
y+=before*p;
break;
}
}
return y;
}
*/
void main()
{
int before=0;
cout << "please enter a number in base 10" << endl;
cin >> before;
while (1)
{
if (before<0)
{
printf("error,input again!\n");
scanf("%d", &before);
}
else
{
break;
}
}
int i;
for(i=2;i<=16;i++)
{
cout<<"转换为"<<i<<"进制是";
change(before,i);
cout<<endl;
}
/* for(i=2;i<=16;i++)
{
cout<<"转换为"<<i<<"进制是";
k=Exchange(before,i);
cout<<k<<endl;
}
*/
}
四、运行结果