鱼C论坛

 找回密码
 立即注册
查看: 5921|回复: 6

[技术交流] 关于二进制转八进制的代码

[复制链接]
发表于 2016-1-3 10:47:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我昨天晚上看了小甲鱼的用栈实现二进制转十进制,然后留给我们的作业是二进制转八进制和十六进制,昨天编了我好久,都没编成功,昨天睡觉前整理了一下思路,今天早上编成功的,这次是自己编的啊,就是栈的部分是参考小甲鱼视频里的,由于那堂课的源代码要30鱼币,好贵的,只好自己苦命的编了。求大神指导。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define STACK_INIT_SIZE 20
#define STACKICREAMENT  10

typedef char ElemType;
typedef struct
{
        ElemType *top;
        ElemType *base;
        int stacksize;
}sqStack;

void Initstack(sqStack *s)
{
        s->base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType) );
        if(!s->base)
        {
                exit(0);
        }
        s->top=s->base;
        s->stacksize=STACK_INIT_SIZE;
}

void Push(sqStack *s, ElemType e)
{
        if(s->top - s->base >= s->stacksize)
        {
                s->base=realloc(s->base, (s->stacksize + STACKICREAMENT ) * sizeof(ElemType) );
                if(!s->base)
                {
                        exit(0);
                }
        }
        *(s->top)=e;
        s->top++;
}

void Pop(sqStack *s, ElemType *e)
{
        if(s->top==s->base)
        {
                return;
        }
        *e= *--(s->top);
}

int Stacksize(sqStack s)
{
        return (s.top - s.base);
}
int main()
{
        int i,j,k,a,len,len1,len2,sum1=0,sum2=0;
        ElemType e,sum;
        sqStack s1,s2;
        Initstack(&s1);
        Initstack(&s2);
        printf("请输入二进制数,以#结束\n");
        scanf("%c",&e);
        while(e!='#')
        {
                Push(&s1,e);
                scanf("%c",&e);
        }
        
        getchar();
        
        len1=Stacksize(s1);
        printf("该栈的容量为%d\n",len1);
        len=len1;
        while(len % 3 != 0) 
        {
                len++;
        }
        for(i=0; i< len /3; i++)
        {
        
            a=3;
            if(i == len /3 - 1 && len != len1)
            {
                    a= len1 % 3;
                }
                for(j=0; j<a; j++)
            {
                    Pop(&s1,&e);
                    sum1=sum1+(e-48)*pow(2,j);
                }
                sum=sum1+48;
                sum1=0;
                Push(&s2,sum);
        }
        
        len2=Stacksize(s2);
        printf("转换为八进制为:"); 
        for(k=0; k<len2 ;k++)
        {
                Pop(&s2,&sum);
                printf("%c",sum);
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-3 10:48:57 | 显示全部楼层
关于16进制,只要把代码稍稍改动就可以,就是八进制是3位,十六进制是4位,看过视频的应该懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-14 15:29:53 | 显示全部楼层
看看哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-20 18:19:20 | 显示全部楼层
谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2016-2-28 13:59:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 16:26:56 | 显示全部楼层
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include<math.h>


#define INIT_STACK_SIZE 20
#define STACKINCREMENT 10

typedef char ElemType;

typedef struct {
    ElemType *base;
    ElemType *top;
    int stackSize;

}seStack;

void initStack(seStack *s);
void push(seStack *s,ElemType e);
void pop(seStack *s,ElemType *e);
int stackLen(seStack s);
int main() {
seStack s2,s3;
    initStack(&s2);
    initStack(&s3);
    printf("请输入你想要转化的二进制数:输入'#'结束");
    ElemType c1;
    scanf("%c",&c1);
    while(c1 != '#')
    {
        push(&s2,c1);
        scanf("%c",&c1);
    }
    getchar();
    int i;
    if(stackLen(s2) % 3 == 0)
    {
        i = stackLen(s2)/3;
    } else
        i = stackLen(s2)/3 + 1;
    for(;i>0;i--)
    {
        ElemType mid = 0;
        ElemType rval;
        for(int j = 0;j<3;j++)
        {
            if(s2.base == s2.top)
            {
                rval = '0';
            }
           else
                pop(&s2,&rval);
            mid += (rval-48) * pow(2,j);
        }
        push(&s3,mid);
    }
    printf("转化后的八进制数是:");
    ElemType val;
    while (s3.top != s3.base)
    {
        pop(&s3,&val);
        printf("%d",val);
    }

    return 0;
}



void initStack(seStack *s)
{
    s->base = (ElemType *)malloc(sizeof(ElemType));
    if(!s->base)
        exit(0);
    s->top = s->base;
    s->stackSize = INIT_STACK_SIZE;
}

void push(seStack *s,ElemType e)
{
    if(s->top - s->base >= s->stackSize)
    {
        s->base = (ElemType *)realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        s->top = s->base + s->stackSize;
        s->stackSize = s->stackSize + STACKINCREMENT;
    }
    *(s->top) = e;
    s->top++;
}

void pop(seStack *s,ElemType *e)
{
    if(s->top == s->base)
        return;
    *e = *--(s->top);
}

int stackLen(seStack s)
{
    return (s.top - s.base);
}
这样不知道可不可以。算了几个是对的,就是不知道有没有啥逻辑错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-22 21:44:32 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 #define Stack_size 20
 #define Stackinrement 10
 typedef char Elemtype;
 typedef struct{
    Elemtype *bottom ;
    Elemtype *top;
    int Stacksize;
  }sqstack;
  
  
 void initstack(sqstack *s)
 {
   s->bottom=(Elemtype*)malloc((Stack_size)*sizeof(Elemtype));
   if(!s->bottom)
   {exit(0);}
   s->top=s->bottom;
   s->Stacksize= Stack_size;
 }
 
 void push(sqstack *s,Elemtype e)
 {
      if((s->top-s->bottom)>=s->Stacksize-1)
      {s->bottom=(Elemtype*)realloc(s->bottom,(s->Stacksize+Stackinrement)*sizeof(Elemtype))    ;
      if(!s->bottom)
       {exit(0);}
        s->top=s->bottom+Stackinrement;
       s->Stacksize=s->Stacksize+Stackinrement;
      }
    *s->top= e  ;
    s->top++;

 }
 
 
 
 void pop(sqstack *s,Elemtype *e)
 {
 if(s->top==s->bottom)
 {exit(0);}
  s->top--;
  *e=*s->top;
 

 }
 
 int stacklen(sqstack s)
 {return  (s.top-s.bottom)  ;
 }
 
 int main()
 { Elemtype c;
   sqstack s,s1;
   initstack(&s);
   initstack(&s1);
   printf ("输入二进制数,输入#代表结束");
    scanf("%c",&c);
    while(c!='#')
    {

        push(&s,c) ;
        scanf("%c",&c);

    }
    getchar();
        int len= stacklen(s);
        char sum; 
        int len1=len/3;
        int a=len%3;
        int j=0;
        printf("当前栈容量为%d\n",len);
        for(int i=0;i<len1;i++)
        {
                for(j=0;j<3;j++)
                        {
                        pop(&s,&c);
                sum=sum+pow(2,j)*(c-48);   
                        }
                        j=0;
                        sum=sum+48;
                        push(&s1,sum);
            sum=0;
        }
        if(a!=0)
        {
                for(int k=0;k<a;k++)
                {
                sum=sum+pow(2,k)*(c-48);
                
                        }
                        len1=len1+1;
                        push(&s1,sum);
                }
                
                printf("转化结果为");
                for(int i=0;i<len1;i++)
                {
                 
                 pop(&s1,&sum);
                 printf("%c",sum);
                
                }
                 printf("\n");

   return 0;
大部分参考了视频教学,改的有点乱,能跑就懒得动了
大概的想法就是第一个s堆完了以后,先把不一定能凑成三个的顶部元素拿掉,再三个三个弹出来加完推到s1里,最后判断要不要推一次顶上的几个元素和
最后的sum跑出来才忘记加48了,

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表