代码
#include <iostream>
#include <cstdio>
#include <stack>
#include <ctime>
#define BASE 13
using namespace std;
/**
* @brief 十进制转化成任意进制 (迭代版)
* @param s 用来保存结果的栈
* @param n 待转换的十进制数
* @param base 转换成的进制
* @return
*
*/
void convertI(stack<char>& s,__int64 n, int base)
{
static char digit[]=
{
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F'
};
while(n>0)
{
s.push(digit[n%base]) ;
n/=base;
}
}
/**
* @brief 十进制转化成任意进制 (递归版)
* @param s 用来保存结果的栈
* @param n 待转换的十进制数
* @param base 转换成的进制
* @return
*
*/
void convertR(stack<char>& s,__int64 n, int base)
{
static char digit[]=
{
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F'
};
if(0<n)
{
convertR(s,n/base,base);
//通过递归,得到所有更高位。(也就是说递归应该是一下子递归到底,
//直到递归基,然后由递归基逐层上推)
s.push(digit[n%base]);
}
}
int main()
{
stack<char> a;
__int64 n;
cin>>n;
clock_t st,en;clock_t st1,en1;
cout<<"\n十进制数"<<n<<"转化成"<<BASE<<"进制 (迭代版)\n" ;
st=clock();
convertI(a,n,BASE);
while(!a.empty())
{
printf("%c",a.top());
a.pop();
}
en=clock();
cout<<"\n总用时t="<<(double)(en-st)/CLOCKS_PER_SEC<<"s\n";
cout<<"\n十进制数"<<n<<"转化成"<<BASE<<"进制 (递归版)\n" ;
st1=clock();
convertR(a,n,BASE);
while(!a.empty())
{
printf("%c",a.top());
a.pop();
}
en1=clock();
cout<<"\n总用时t="<<(double)(en1-st1)/CLOCKS_PER_SEC<<"s\n";
cout<<endl;
return 0;
}
两种算法算出的结果居然是倒着的!
这个意外对于我来说是件好事,让我更加深刻地理解了递归,以12345转换成16进制为例:
void convertR(stack<char>& s,__int64 n, int base)
{
static char digit[]=
{
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F'
};
if(0<n)
{
convertR(s,n/base,base);
//通过递归,得到所有更高位。(也就是说递归应该是一下子递归到底,
//直到递归基,然后由递归基逐层上推)
s.push(digit[n%base]);
cout<<"n="<<n<<",进栈字符="<<digit[n%base]<<", top="<<s.top()<<endl;
}
}//新进制的数位,由高到低,自底而上(顶)存放于栈s中
递归的过程是:
* n=123456->(n>0)->convertR(s,n/base,base)
* n=7716->(n>0)->convertR(s,n/base,base)
* n=482->(n>0)->convertR(s,n/base,base)
* n=30->(n>0)->convertR(s,n/base,base)
* n=1->(n>0)->convertR(s,n/base,base)
* n=0->(n>0)->
* n=1->(n>0)->s.push(digit[n%base])->push(1)
* n=30->(n>0)->s.push(digit[n%base])->push(E)
* n=482->(n>0)->s.push(digit[n%base])->push(2)
* n=7716->(n>0)->s.push(digit[n%base])->push(4)
* n=123456->(n>0)->s.push(digit[n%base])->push(0)
所以最终栈自顶而下,保存的是新进制的从低到高位,而输出的话,要按照从高到低输出,所以最终输出的结果是反的