10进制数转换为其它进制的原理:
1.十进制数N对目标进制取余,将取余结果入栈。
2.十进制数N除以目标进制作为新的十进制数N。
3.重复进行1和2,直到N=0为止。
4.将堆栈内容输出就是转换后的结果。
实现代码如下:
/*
* Copyright (c) 2014, 武汉大学
* All rights reserved.
*
* 文件名称:number_conversion.cpp
* 摘 要:实现10进制数向其它进制的转换
*
* 当前版本:1.0
* 作 者:田鑫
* 完成日期:2014年3月29日
*/
#include<iostream>
#include "stack.h"
bool number_conversion(){
//对于输入的任意一个非负十进制数,打印输出与其等值的K进制数
SqStack s;
InitStack(s);
std::cout << "请输入待转换的十进制数N:";
int N;
std::cin >> N;
int temp = N;
if( N < 0)
{
std::cout << "不能输入负数\n";
return false;
}
std::cout << "请输入欲转换为的目标进制K:";
int K;
std::cin >> K;
if( K <= 1 || K > 10 )
{
std::cout << "输入进制不合法,请输入2—10之间的进制\n";
return false;
}
while ( N != 0 )
{
Push(s, N % K );
N = N/K;
}
std::cout << temp <<"的" << K << "进制形式为:";
while( !StackEmpty(s))
{
ElemType e;
Pop(s, e);
std::cout << e;
}
std::cout << std::endl;
return true;
}
/*
* Copyright (c) 2014, 武汉大学
* All rights reserved.
*
* 文件名称:stack.h
* 摘 要:声明与堆栈操作相关的常用函数
*
* 当前版本:1.0
* 作 者:田鑫
* 完成日期:2014年3月29日
*/
#ifndef STACK_H
#define STACK_H
typedef int ElemType; //堆栈元素的数据类型
const int STACK_INIT_SIZE = 20; //定义堆栈初始大小
const int STACK_INCREMENT = 10; //当堆栈空间不够时,堆栈增量的大小
typedef struct {
ElemType * base;
ElemType * top;
int stacksize;
}SqStack;
bool InitStack(SqStack &s);
/*
* 函数介绍:构造一个空堆栈
* 输入参数:堆栈名
* 输出参数:无
* 返回值 :bool值
*/
bool Push(SqStack &s, ElemType e);
/*
* 函数介绍:将元素e压入栈顶
* 输入参数:堆栈名,待入栈元素值
* 输出参数:无
* 返回值 :bool值
*/
bool Pop(SqStack &s, ElemType & e);
/*
* 函数介绍:弹出栈顶元素,用e返回栈顶元素的值
* 输入参数:堆栈名
* 输出参数:e:返回栈顶元素的值
* 返回值 :bool值
*/
bool StackEmpty(SqStack &s);
/*
* 函数介绍:栈空返回true,否则返回false
* 输入参数:堆栈名
* 输出参数:空
* 返回值 :bool值
*/
#endif
/*
* Copyright (c) 2014, 武汉大学
* All rights reserved.
*
* 文件名称:stack.cpp
* 摘 要:实现与堆栈操作相关的常用函数
*
* 当前版本:1.0
* 作 者:田鑫
* 完成日期:2014年3月29日
*/
#include<iostream>
#include "stack.h"
bool InitStack(SqStack &s){ //构造一个空栈
s.base = (ElemType*) malloc(STACK_INIT_SIZE*sizeof(ElemType));
if( s.base == NULL )
{
std::cout << "内存分配失败:\n";
return false;
}
s.top = s.base; //堆栈为空时,栈顶指针和栈底指针都指向栈底
s.stacksize = STACK_INIT_SIZE;
return true;
}
bool Push(SqStack &s, ElemType e){ //将元素e压入栈顶
if(s.top - s.base >= STACK_INIT_SIZE) //判断堆栈是否还有剩余空间
{
s.base = (ElemType*) realloc( s.base, (s.stacksize+STACK_INCREMENT) * sizeof(ElemType) );
if( s.base == NULL )
{
std::cout << "内存分配失败:\n";
return false;
}
s.top = s.base + s.stacksize;
s.stacksize += STACK_INCREMENT;
}
*s.top = e;
++s.top;
return true;
}
bool Pop(SqStack &s, ElemType & e){
//若栈不空,则删除s的栈顶元素,用e返回其值,并返回true;否则返回false
if(s.top == s.base)
return false;
--s.top;
e = *s.top;
return true;
}
bool StackEmpty(SqStack &s){
if(s.base == s.top)
return true;
else
return false;
}
运行效果如图: