【问题描述】 已知十进制数n,试将其转换成对应的r进制数(r为二进制至十六进制间任意值)
【问题分析】
公式:N=(N div d)*d+N mod d (div表示整除,mod表示求余)
(1348)(十进制)=(2504)(八进制)=(544)(十六进制)=(10101000100)(二进制)以十进制转换成相应的八进制数举例:
注:当N÷8的商等于0时,结束运算
因为取余数的顺序正好与计算产生余数的顺序相反,在转换过程中,将每次产生的余数依次保存起来,转换结束后,再按保存的逆序取出余数打印即可。显然,保存的余数应该具备“后进先出”的特点,可用栈作为数据结构
主要代码:
void conversion(int n, int r) {
SeqStack S;
ElemType x;
char c;
InitStack(S); //初始化空栈
while (n) { //当N非零时,循环
Push(S, n % r); //把N与r进制求余得到的八进制数压入栈S
n = n / r; //把N更新为N与进制的商
}
while (!StackEmpty(S)) { //当栈S非空时,循环
x = Pop(S);
if (x >= 10) {
c = 'A' + x - 10;
} else {
c = '0' + x;
}
cout << c;
}
}
完整代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
const int MAXSIZE = 100;
typedef int ElemType;
typedef struct {
ElemType date[MAXSIZE];
int top;
} SeqStack;
void InitStack(SeqStack &S) { //初始化
S.top = -1;
}
void Push(SeqStack &S, ElemType x) { //入栈
if (S.top == MAXSIZE - 1) {
cout << "栈已满" << endl;
exit(1);
}
S.top++;
S.date[S.top] = x;
}
ElemType Pop(SeqStack &S) { //出栈
if (S.top == -1) {
cout << "栈已空" << endl;
exit(1);
}
ElemType x = S.date[S.top];
S.top--;
return x;
}
ElemType Top(SeqStack &S) { //取栈顶元素
if (S.top == -1) {
cout << "栈已空" << endl;
exit(1);
}
return S.date[S.top];
}
bool StackEmpty(SeqStack &S) { //判断栈是否为空
return S.top == -1;
}
bool StackFull(SeqStack &S) { //判断栈是否为满
return S.top == MAXSIZE - 1;
}
void conversion(int n, int r) {
SeqStack S;
ElemType x;
char c;
InitStack(S); //初始化空栈
while (n) { //当N非零时,循环
Push(S, n % r); //把N与r进制求余得到的八进制数压入栈S
n = n / r; //把N更新为N与进制的商
}
while (!StackEmpty(S)) { //当栈S非空时,循环
x = Pop(S);
if (x >= 10) {
c = 'A' + x - 10;
} else {
c = '0' + x;
}
cout << c;
}
}
int main() {
int n, r;
cout << "请输入输入转换的十进制数: ";
cin >> n;
cout << "请输入需要转换的进制: ";
cin >> r;
cout << "相应的" << r << "进制数为: ";
conversion(n, r);
cout << endl;
return 0;
}
运行结果: