目录
一.十进制转换任意进制原理:
将十进制数123按照十进制分解得到:
123 = 1*10^2 + 2*10^1 + 3*10^0
得到通式:ABC = A*X^2 + B*X^1 + C*X^0;
二. 程序构思:
要分解ABC,根据上面的通式
- 将(A*X^2 + B*X^1 + C*X^0) 取模 X 得到 C,然后除以X得到(A*X^1 + B*X^0 ) ;
- 将(A*X^1 + B*X^0) 取模 X 得到 B,然后除以X得到(A*X^0 )
- 将(A*X^0 ) 取模 X 得到 A;
- 由步骤1.2.3.执行完毕后依次得到C . B. A。
根据栈"先进后出,后进先出"的特性,依次将计算得到的值压入栈中,然后弹出得到A.B.C.
三. 程序实现
#include <stdio.h>
#define BUFFER_SIZE 50
static int buffer[ BUFFER_SIZE ];
static int index;
void stack_init(void)//栈初始化
{
index = -1;
}
void stack_deinit(void)// 栈销毁
{
index = -1;
}
int stack_full(void)// 判断栈满
{
return index == BUFFER_SIZE;
}
int stack_empty(void)// 判断栈空
{
return index == -1;
}
void stack_push(int data)// 压栈
{
if ( !stack_full() )
buffer[index++] = data;
}
void stack_pop(void)// 弹栈
{
if( !stack_empty() )
index--;
}
int stack_top (int* data)// 访问栈顶
{
if( stack_empty() )
return -1 ;
*data = buffer[index-1];
return 0;
}
void printb(int data, int base)// 进制转换
{
stack_init();
do{
stack_push(data % base);
} while (data /= base);
for(; !stack_empty(); stack_pop())
{
int data = 0;
stack_top(&data);
if ( data < 10 )// 超过10按照字母表示
printf("%d", data);
else
printf("%c", data-10 +'A');
}
printf("\n");
stack_deinit();
}
int main(void)
{
int data;
int base;
printf("data:");
scanf("%d",&data);
printf("base:");
scanf("%d", &base);
if ( base == 0)
{
printf("The base entered cannot be 0!\n");
return 0;
}
printb(data, base);
return 0;
}