#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define maxsize 1000000
typedef struct//栈
{
char c[maxsize];
int top;
}seqstack;
int empty_seqstack(seqstack *s)//判断栈是否满
{
if(s->top==-1)
return 1;
else
return 0;
}
void push_seqstack(seqstack *s,char x)//入栈
{
if(s->top==maxsize-1) //判断栈是否满
printf("stack is full\n");
else
{
s->top++; //先是top加1,避免覆盖原始数据
s->c[s->top]=x;
}
}
void pop_seqstack(seqstack*s)
{
char x;
while(s->top!=-1) //判断是否为空栈
{
x=s->c[s->top];
printf("%c",x);
s->top–;
}
}
void conversion(int a,int r,seqstack *s)
{
char x;
while(a!=0)
{
if(a%r<=9)
{
x=a%r+'0';
push_seqstack(s,x);
}
else
{
x=a%r+'A'-10;
push_seqstack(s,x);
}
a=a/r;
}
}
void conver_decimal(float de,int r)
{
float flag;
de =de -(int)de;//先是对传进来的实数进行了取小数
int dc;
char x1;
char s[100000]=".";
int i=1;
flag =de; //用于判断实数是否有小数部分
while(de>0.000001)
{
if((int)(de*r)<=9)
{
dc = (int)(de*r); //小数部分乘以对应进制,进行进制的转换
de =de *r;
de = de - dc;
x1 = dc +'0';
s[i++]=x1;
}
else
{
dc = (int)(de*r);
de =de *r;
de = de - dc;
x1 = dc +'A'-10;//进制大于10,,则用字母A,B,C来表示
s[i++]=x1;
}
}
if(flag!=0)
{
printf("%s",s);
}
}
int main()
{
float a;
int r;
seqstack s;
s=(seqstack)malloc(sizeof(seqstack));
s->top=-1; // -1定义为栈空
printf(“请输入要转换的数和进制\n”);
scanf("%f %d",&a,&r);
conversion(a,r,s); //将数字对的整数部分转换成对应进制
pop_seqstack(s); //利用栈的特性,先进后出,得到对应进制。
conver_decimal(a,r); //小数部分算法,不需要栈,先进先出即可,因此顺序输出
return 0;
}