为了简化代码,只考虑10以内的进制转化
大于10的进制转换只需要在输出的时候加判断语句,例如if(top()==10)cout<<“A”;
(注意栈顶元素返回和出栈的区分,前者只是返回一个值,栈顶指针没有变化。如果在if(top()==10) 里用出栈来得到栈顶元素,即使判断不对,栈顶元素也出栈了,进入下一条判断语句的栈顶元素就不是上一个栈顶元素了)
第一种方法:栈
因为进制转换的方法很契合栈的先进后出的特点,所以用栈来写,
总体思路
把计算出来的数都压入栈,最后再把栈中的元素全部输出
#include<bits/stdc++.h>
using namespace std;
class stackk {//加k防止重名
int top;
int a[100];
public:
stackk()
{
top = -1;//初始化为空栈
}
~stackk()
{
}
int gettop()
{
if (is_empty())//判断是否为空
{
cout << "error!" << endl;
exit(0);
}
else
{
top--;
return a[top + 1];
}
}
void pushtop(int b)
{
if (is_full())
{
cout << "error!" << endl;
}
else
{
top++;
a[top] = b;
}
}
bool is_empty()
{
return top == -1;
}
bool is_full()
{
return top == 99;
}
};
void transformm(int x, int y)
{
stackk a;
while (1)//先按计算方法把结果元素都入栈
{
if (x < y)
{
a.pushtop(x);
break;
}
else
{
a.pushtop(x % y);
x /= y;
}
}
while (1)//出栈
{
if (a.is_empty())
{
cout << endl;
break;
}
else
{
cout << a.gettop();
}
}
}
int main()
{
int x, y;
while (1)
{
cin >> x >> y;//x是十进制数,y是要转换的进制
transformm(x, y);
}
}
第二种方法:递归
关键思想;
利用递归先处理终止情况的特点
先让他最先输出最后的一种情况,然后再往回执行下一条语句,即下一个输出
比如:
4的二进制表示为100,他先到终止情况,输出一个1,然后返回上一层,输出x%y,这时这一层处理完了,再返回再上一层,同理输出x%y,由于没有更上层了,结束
#include<bits/stdc++.h>
using namespace std;
void transformm(int x, int y)
{
if (x < y)
cout <<x;
else
{
transformm(x / y, y);
cout << x % y;
}
}
int main()
{
int x, y;
while (1)
{
cin >> x >> y;//x是十进制数,y是要转换的进制
transformm(x, y);
}
}