鱼C论坛

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

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

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

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

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

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

  4. #define STACK_INIT_SIZE 20
  5. #define STACKICREAMENT  10

  6. typedef char ElemType;
  7. typedef struct
  8. {
  9.         ElemType *top;
  10.         ElemType *base;
  11.         int stacksize;
  12. }sqStack;

  13. void Initstack(sqStack *s)
  14. {
  15.         s->base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType) );
  16.         if(!s->base)
  17.         {
  18.                 exit(0);
  19.         }
  20.         s->top=s->base;
  21.         s->stacksize=STACK_INIT_SIZE;
  22. }

  23. void Push(sqStack *s, ElemType e)
  24. {
  25.         if(s->top - s->base >= s->stacksize)
  26.         {
  27.                 s->base=realloc(s->base, (s->stacksize + STACKICREAMENT ) * sizeof(ElemType) );
  28.                 if(!s->base)
  29.                 {
  30.                         exit(0);
  31.                 }
  32.         }
  33.         *(s->top)=e;
  34.         s->top++;
  35. }

  36. void Pop(sqStack *s, ElemType *e)
  37. {
  38.         if(s->top==s->base)
  39.         {
  40.                 return;
  41.         }
  42.         *e= *--(s->top);
  43. }

  44. int Stacksize(sqStack s)
  45. {
  46.         return (s.top - s.base);
  47. }
  48. int main()
  49. {
  50.         int i,j,k,a,len,len1,len2,sum1=0,sum2=0;
  51.         ElemType e,sum;
  52.         sqStack s1,s2;
  53.         Initstack(&s1);
  54.         Initstack(&s2);
  55.         printf("请输入二进制数,以#结束\n");
  56.         scanf("%c",&e);
  57.         while(e!='#')
  58.         {
  59.                 Push(&s1,e);
  60.                 scanf("%c",&e);
  61.         }
  62.        
  63.         getchar();
  64.        
  65.         len1=Stacksize(s1);
  66.         printf("该栈的容量为%d\n",len1);
  67.         len=len1;
  68.         while(len % 3 != 0)
  69.         {
  70.                 len++;
  71.         }
  72.         for(i=0; i< len /3; i++)
  73.         {
  74.        
  75.             a=3;
  76.             if(i == len /3 - 1 && len != len1)
  77.             {
  78.                     a= len1 % 3;
  79.                 }
  80.                 for(j=0; j<a; j++)
  81.             {
  82.                     Pop(&s1,&e);
  83.                     sum1=sum1+(e-48)*pow(2,j);
  84.                 }
  85.                 sum=sum1+48;
  86.                 sum1=0;
  87.                 Push(&s2,sum);
  88.         }
  89.        
  90.         len2=Stacksize(s2);
  91.         printf("转换为八进制为:");
  92.         for(k=0; k<len2 ;k++)
  93.         {
  94.                 Pop(&s2,&sum);
  95.                 printf("%c",sum);
  96.         }
  97.        
  98.         return 0;
  99. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include<math.h>


  5. #define INIT_STACK_SIZE 20
  6. #define STACKINCREMENT 10

  7. typedef char ElemType;

  8. typedef struct {
  9.     ElemType *base;
  10.     ElemType *top;
  11.     int stackSize;

  12. }seStack;

  13. void initStack(seStack *s);
  14. void push(seStack *s,ElemType e);
  15. void pop(seStack *s,ElemType *e);
  16. int stackLen(seStack s);
  17. int main() {
  18. seStack s2,s3;
  19.     initStack(&s2);
  20.     initStack(&s3);
  21.     printf("请输入你想要转化的二进制数:输入'#'结束");
  22.     ElemType c1;
  23.     scanf("%c",&c1);
  24.     while(c1 != '#')
  25.     {
  26.         push(&s2,c1);
  27.         scanf("%c",&c1);
  28.     }
  29.     getchar();
  30.     int i;
  31.     if(stackLen(s2) % 3 == 0)
  32.     {
  33.         i = stackLen(s2)/3;
  34.     } else
  35.         i = stackLen(s2)/3 + 1;
  36.     for(;i>0;i--)
  37.     {
  38.         ElemType mid = 0;
  39.         ElemType rval;
  40.         for(int j = 0;j<3;j++)
  41.         {
  42.             if(s2.base == s2.top)
  43.             {
  44.                 rval = '0';
  45.             }
  46.            else
  47.                 pop(&s2,&rval);
  48.             mid += (rval-48) * pow(2,j);
  49.         }
  50.         push(&s3,mid);
  51.     }
  52.     printf("转化后的八进制数是:");
  53.     ElemType val;
  54.     while (s3.top != s3.base)
  55.     {
  56.         pop(&s3,&val);
  57.         printf("%d",val);
  58.     }

  59.     return 0;
  60. }



  61. void initStack(seStack *s)
  62. {
  63.     s->base = (ElemType *)malloc(sizeof(ElemType));
  64.     if(!s->base)
  65.         exit(0);
  66.     s->top = s->base;
  67.     s->stackSize = INIT_STACK_SIZE;
  68. }

  69. void push(seStack *s,ElemType e)
  70. {
  71.     if(s->top - s->base >= s->stackSize)
  72.     {
  73.         s->base = (ElemType *)realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType));
  74.         s->top = s->base + s->stackSize;
  75.         s->stackSize = s->stackSize + STACKINCREMENT;
  76.     }
  77.     *(s->top) = e;
  78.     s->top++;
  79. }

  80. void pop(seStack *s,ElemType *e)
  81. {
  82.     if(s->top == s->base)
  83.         return;
  84.     *e = *--(s->top);
  85. }

  86. int stackLen(seStack s)
  87. {
  88.     return (s.top - s.base);
  89. }
复制代码

这样不知道可不可以。算了几个是对的,就是不知道有没有啥逻辑错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-22 21:44:32 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define Stack_size 20
  5. #define Stackinrement 10
  6. typedef char Elemtype;
  7. typedef struct{
  8.     Elemtype *bottom ;
  9.     Elemtype *top;
  10.     int Stacksize;
  11.   }sqstack;
  12.   
  13.   
  14. void initstack(sqstack *s)
  15. {
  16.    s->bottom=(Elemtype*)malloc((Stack_size)*sizeof(Elemtype));
  17.    if(!s->bottom)
  18.    {exit(0);}
  19.    s->top=s->bottom;
  20.    s->Stacksize= Stack_size;
  21. }

  22. void push(sqstack *s,Elemtype e)
  23. {
  24.       if((s->top-s->bottom)>=s->Stacksize-1)
  25.       {s->bottom=(Elemtype*)realloc(s->bottom,(s->Stacksize+Stackinrement)*sizeof(Elemtype))    ;
  26.       if(!s->bottom)
  27.        {exit(0);}
  28.         s->top=s->bottom+Stackinrement;
  29.        s->Stacksize=s->Stacksize+Stackinrement;
  30.       }
  31.     *s->top= e  ;
  32.     s->top++;

  33. }



  34. void pop(sqstack *s,Elemtype *e)
  35. {
  36. if(s->top==s->bottom)
  37. {exit(0);}
  38.   s->top--;
  39.   *e=*s->top;


  40. }

  41. int stacklen(sqstack s)
  42. {return  (s.top-s.bottom)  ;
  43. }

  44. int main()
  45. { Elemtype c;
  46.    sqstack s,s1;
  47.    initstack(&s);
  48.    initstack(&s1);
  49.    printf ("输入二进制数,输入#代表结束");
  50.     scanf("%c",&c);
  51.     while(c!='#')
  52.     {

  53.         push(&s,c) ;
  54.         scanf("%c",&c);

  55.     }
  56.     getchar();
  57.         int len= stacklen(s);
  58.         char sum;
  59.         int len1=len/3;
  60.         int a=len%3;
  61.         int j=0;
  62.         printf("当前栈容量为%d\n",len);
  63.         for(int i=0;i<len1;i++)
  64.         {
  65.                 for(j=0;j<3;j++)
  66.                         {
  67.                         pop(&s,&c);
  68.                 sum=sum+pow(2,j)*(c-48);   
  69.                         }
  70.                         j=0;
  71.                         sum=sum+48;
  72.                         push(&s1,sum);
  73.             sum=0;
  74.         }
  75.         if(a!=0)
  76.         {
  77.                 for(int k=0;k<a;k++)
  78.                 {
  79.                 sum=sum+pow(2,k)*(c-48);
  80.                
  81.                         }
  82.                         len1=len1+1;
  83.                         push(&s1,sum);
  84.                 }
  85.                
  86.                 printf("转化结果为");
  87.                 for(int i=0;i<len1;i++)
  88.                 {
  89.                  
  90.                  pop(&s1,&sum);
  91.                  printf("%c",sum);
  92.                
  93.                 }
  94.                  printf("\n");

  95.    return 0;
复制代码

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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