栈的应用1——数制转换

数制

一般分为二、八、十、十六这几种常见的(没错就是我现在能见到的)
x进制就是0~x-1构成每一位,就如二进制是0、1,八进制是0到7

数制转换

数制转换一直是计算机的一个基本问题,目前已经有了很多的解决方法。

如果是其他进制转换十进制(因为十进制多数人还是比较熟悉的,毕竟买菜时价钱不是二进制的)
先找到每一个数字的位数:
整数部分将个位置为0位,往前依次加一位;
小数部分第一位是-1,往后依次减一;
因为是二进制,所以应该是二的多少倍乘以原来二进制的数字,如个位应该是:
2的零次幂乘一。
在这里插入图片描述
求和就可以得到答案了。

十进制转其他进制的话,也是类似,就是将过程反过来了。
1.正数
将原来的项除进制(这里取2),商保留,余项写在旁边;
不断进行该操作,直到剩下余项为止。
将余项反过来,就是答案了。
在这里插入图片描述
反过来算一遍,2+16+32=50.

2.小数
和上面的小数部分反过来,将小数部分乘二,每一次都取整数部分,直到小数部分为0.
在这里插入图片描述
0.001,算一下也就是0.125了。

3.负数
这个稍有不同,因为负数的二进制有补码的存在,所以会所有不同。
其实也就是按正的算完了加一个求补码的过程:0 1取反后加一
如50是110010
那么-50应该先取反(叫反码)001101
然后加一:010010

敲黑板了

那这些和栈有什么关系呢?
来了来了,那就是在十进制正数部分有一个将商取反的过程,刚好和栈的功能相匹配
嗯,就是这样
(所以我这篇文章到底在讲什么啊,枯了)

#include <iostream>
#define N 8//八进制,可改
using namespace std;

struct link//栈
{
    int data;
    struct link* next;
};

void input(struct link* head,int a)//压栈
{
    struct link*p=(struct link*)malloc(sizeof(struct link));
    p->data=a;
    p->next=head->next;
    head->next=p;
}

void output(struct link* head)//出栈
{
    struct link* p=head->next;
    cout << p->data << " ";
    head->next=p->next;
    free(p);
}

void work(int number)
{
    struct link* head=(struct link* )malloc(sizeof(struct link));
    head->next=NULL;
    while(number)//一直除,余数留下
    {
        input(head,number%N);
        number/=N;
    }
    while(head->next)//输出栈
    {
        output(head);
    }
    free(head);
}

int main()
{
    cout << "Input a number please:"<<endl;
    int number;
    cin>>number;
    work(number);
    return 0;
}

友情提示一下,代码中的压栈出栈函数并不是非常严格的,只是在这个代码块里面没有问题,正常应该有一个出栈判空等其他的,这里因为没必要而没有深究

跑了50,结果是62(八进制)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值