10进制数转换为其它进制

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;
}

运行效果如图:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值