交付清单
数制转换问题
问题描述:进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六进制。十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制数0~15),十六进制数运算规律是逢十六进一,例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。
要求:
1.输入一个十进制数N,将它转换成R进制数输出
2.输入数据包含多个测试实例,每个测试实例至少包含两个整数N和R(R为2、8、16)
交付清单
/*栈实现进制转化
*十进制最大转化为36进制用10(A)-35(Z)表示
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10 //栈的初始空间
#define STACKINCREMENT 5 //追加的存储空间
//结构体
typedef struct {
int *base;
int *top;
int stacksize;
}Stack;
//Create static
void InitStack(Stack *s){
s->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!s->base){ //申请存储空间失败,直接退出
exit(0);
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
//Insert function
void Push(Stack *s,int e){
if(s->top-s->base>STACK_INIT_SIZE){//若栈已满,追加存储空间
s->base = (int *)malloc(sizeof(int)*(STACK_INIT_SIZE+STACKINCREMENT));
if(!s->base){
exit(0);
}
s->top = s->base+s->stacksize; //栈顶指针发生变化
s->stacksize += STACKINCREMENT; //存储空间发生变化
}
*++s->top = e;//栈顶指针先加一,然后赋值
}
//main function
main(){
Stack S;
int n,m; //n进制数,m基数
InitStack(&S);
while(1){ //方便多次测试程序,可以省略
printf("请输入十进制整数以及转换的进制数:");
scanf("%d %d",&n,&m);
int s = n; //保存n的数值
if(m>36){
printf("输入的基数不满足条件,退出程序");
return 0;
}
printf("十进制%d转化成%d进制结果为:",s,m);
if(n<0){ //若为负数,添加负号
n = abs(n);//负数取绝对值
printf("-");
}
while(n){
Push(&S,n%m);//十进制数取余入栈
n/=m;
}
while(S.top!=S.base){//若栈不为空,继续循环出栈
if(*S.top<=9){
printf("%d",*S.top--);//数字直接取值,然后栈顶指针减一
}
else {//if(*S.top>9&&*S.top<=36){
printf("%c",*S.top+55);
S.top--;
}
}
printf("\n");
}//对应while(1),可以省略
}