基本数学思想:除奇取余,逆序输出(这里便要用到栈的思想了,类比高精运算结果的输出)
首先先介绍一下栈这个东西;
特点:先进后出
代码实现方式:结构体(可能有人觉得麻烦,但是以后工作的工程代码就是必须用结构体来表示栈)
必要的内容:每次放的数据(数组来表示);top变量——top==0是结束的标志,等于0的数组下标不放任何数据;
struct stack
{
int data[1000];
int top
};
struct stack s;
然后我们介绍一下二进制的转化代码模板
#include<bits/stdc++.h>
using namespace std;
struct stackk
{
int data[1000];
int top;
};
struct stackk s;
int main()
{
int n;cin>>n;
while(n)
{
s.data [++s.top]=n%2;
n/=2;
}
while(s.top)
{
printf("%d",s.data[s.top--]);
}
return 0;
}
易错:本人while的条件那里总是容易写错,现在为了防止n这里出错给出一个标准,通常为n或者n>=0;(这里我们统一写n,s.top )
十进制以内的转化
#include<bits/stdc++.h>
using namespace std;
struct stackk
{
int data[1000];
int top;
};
struct stackk s;
int main()
{
int n,m;cin>>n>>m;
while(n)
{
s.data [++s.top]=n%m;
n/=m;
}
while(s.top)
{
printf("%d",s.data[s.top--]);
}
return 0;
}
终极版——16进制(有ABCD...这些牛马)
要点:对付ABCD...这些奇怪的位数——建立一个字符串数组(这里我们给它去个名字叫标准数组或者模板数组)
char str[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
s.data[++s.top]=str[n%m];
注意:int date[100]最好也改成char data[100];
#include<bits/stdc++.h>
using namespace std;
struct stackk
{
char data[100];
int top;
};
struct stackk s;
char str[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int main()
{
int n,m;cin>>n>>m;
while(n)
{
s.data[++s.top]=str[n%m];
n/=m;
}
while(s.top)
{
printf("%c",s.data[s.top--]);
}
return 0;
}
到这里基本结束了,最后再来一个小结;
打板子的易错地方:
①++s.top和s.top--的别写错了
②while循环那里我条件老写错,这里干脆定个标准——统一while(n>0)或者while(n)
算法原理的提炼:栈的先进后出思想
类比:用数组模拟计算结果的时候常常需要逆序输出,这里就需要用到栈的思想了
理由:下标为1的元素是最先计算出来的(如个位),而实际上要从top(最高位)输出才是合理的(我们用手在纸上也是这么去写的)这里就有栈的味道了
场景:位数的转化;高精结果的输出
其他运用:比如说题目考查我们可以把一个数分为2的多少次方之和,这里就可以借助2进制了,同理还可以衍生!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!