数制
一般分为二、八、十、十六这几种常见的(没错就是我现在能见到的)
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(八进制)