1、算法思路设计
将非负十进制整数n转换成b进制
递归出口:n=0;
递归体: f(n/b,s,b);
先进行整除运算n=n/b。整除结果作为下一次的n,求余运算n%b,把该位进制数结果存入数组an中。
从后往前输出数组元素。如果数组元素小于10,照原样输出;如果数组元素大于等于10,输出其相应的符号, 10输出A,11输出B等等
以6位例,递归栈为:
2、代码
#include<iostream>
#include<string.h>
using namespace std;
void f(int n,char* s,int b)
{
static int i;//字符串下标
if(0==n)
{
s[0]='0';
s[1]='\0';
i=0;
return;
}
else if(n<0)
{
s[0]='-';//第一位存符号
n=-n;//取绝对值
i=1;//从1开始保存数
}
char an[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
if(n!=0)
{
f(n/b,s,b);//n/b作为第二次的n
s[i++]=an[n%b];//进制转换计算过程,求余n%b,读取字符
s[i]='\0';
}
}
void ff(int n,char* s,int b)
{
static char bchar[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int i=0;
if(0==n)
{
s[0]='0';
s[1]='\0';
return;
}
else if(n<0)
{
s[0]='-';
n=-n;
i=1;
}
while(0!=n)
{
s[i++]=bchar[n%b];
n=n/b;
}
s[i]='\0';
int max=strlen(s)-1;
int min=s[0]=='-'?1:0;
//将字符串逆序
while(min<max)
{
char t=s[min];
s[min]=s[max];
s[max]=t;
min++;
max--;
}
}
int main()
{
char s[50];
char s1[50];
int in,turn;
cout<<"输入一个数:"<<endl;
cin>>in;
cout<<"你想将它转为几进制:"<<endl;
cin>>turn;
f(in,s,turn);
ff(in,s1,turn);
cout<<"递归求解结果:"<<endl;
cout<<s<<endl;
cout<<"非递归求解结果:"<<endl;
cout<<s1<<endl;
return 0;
}
3、截屏
4、总结
将非负十进制整数n转换成b进制就是,n除以b取余作为转换后的数的低位,在n/b后不为0的情况下,继续除以b,取余作为次低位,直到n为0为止。在这个题中还要注意,n的正负性,如果n为负数,要先判断s[0]是否为-,若是,就将它转换后的进制数从s[1]开始存数,第一位保存字符位。在主函数中,定义一个字符串数组,整个过程以数组衔接,作为存取栈,在函数中设置一个数组an[]作为进制取余后要给s[i++]里存的数,i++不断扩展栈内存。