进制转化

上个星期学了栈和队列,正好下个星期的上机作业是“进制转换”,一般进制转换是通过短除法(除k取余法)来转化,除完之后由下往上将这些数组合在一起,这不这好和栈的特点一样吗?嗯,顿时我的手就有点痒了,于是中午就敲了敲,下午Debug了一下,感觉这问题要考虑全面有点难啊,写个简单的得了。这大于10进制的还涉及字母,还是简单的考虑吧。

基本思路

  • 首先你得把用户输入的数转化为10进制(暂时不要考虑输入大于10进制)
  • 将十进制的数转化为其他进制(同样只考虑不大于10进制的)

@timeline{

输入数(eg:1998),类型为int,以及对应的进制k

@item{

将组成这个数的这些数字分开,1 9 9 8

这里并不能用char 来分开它们,因为数据类型 不仅仅包含一个取值集合,同时也包含了定义在这个取值集合上的一组 操作 ,可以通过除10 取余来分离

}

@item{

转化为10进制

将分离出来的数字依次与对应的k 的幂相乘,最后求和

}

@item{

除m取余,转化为m进制

这里使用% 求模,int 强制类型转化求商

}

输出计算后的结果

}

栈的实现

k进制转化为10进制(k<=10)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//--------------------------------------其他进制转化为十进制--------------------------------------
int SwitchNum_10(Stack &S)
{
//输入的数、对应进制、待转化进制
int data,n,i,num,num_input;
cout << "输入待转化的数:";
cin >> data;
cout << "它为几进制:";
cin >> num_input;

//转化为10进制
num=10;
InitStack(S);

//记录有多少个数字
int record_num_total=0;

//除10取余
for(i=data;i!=0;data=i)
{
i=data / num; //取商
j=data % num; //取余
record_num_total++;
Pop(S,j);

}//入栈

SElemType *r=S.base + 1;
n=0;

//转化为10进制
for(data=0;r!=S.top;r++)
{
data=data + (*r) * pow(num_input,n);
n++;
}
data=data + (*r) * pow(num_input,n);
//cout << data;

//返回10进制数
return data;

}

10进制转化为m进制(m<=10)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//--------------------------------------十进制转化为其他进制--------------------------------------
Status SwitchNum(Stack &S)
{
int data,i,num;
//cout << "输入待转化的数:";
data=SwitchNum_10(S);
cout << "你想把它转化为几进制:";
cin >> num;
InitStack(S);

//除k取余
for(i=data;i!=0;data=i)
{
i=data / num;
j=data % num;
Pop(S,j);

}
cout << "转化为" << num << "进制后为:\n";
//出栈后即为k进制
Push(S);
return OK;
}

(未完待续。。。。)

代码已经同步到仓库:Stuck

花了我一个小时才配置好powerline&airline

又到了毕业季🎓,回首高中的日子,满满的回忆。