十进制转换任意进制(可带小数部分)

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

}

猜你喜欢

转载自blog.csdn.net/cruel2436/article/details/83188089