背景引入
今天我跟往常一样,继续刷算法题,突然看到进制转化,能不能不使用栈去实现(如果使用栈的话,光定义栈的数据结构,和栈的各种操作,之间函数的使用)代码量有一点多。能不能有简单一点的算法。
算法设计过程
开始想法
刚开始,我不打算使用栈来做,我打算利用不断判断的输入数的位数(一个数有几位数,例如123就是三位数),再输出的时候,将每一个取余得到的数,乘以其对应的位数的10次方(例如,123的第一个1的位数的10次方就是100),分别用几个变量(变量数量等于数的位数)去保存各个求余后的数和其位数的10次方的乘积。然后将这几个乘积加起来。最终得到结果。
改进想法
然而,这一种就必须在自定义前,将尽可能多的判断位数的条件写满。
这就不符合 算法设计的特征 正确性,健壮性, 和算法的特点 有穷性 。这就是一个低层次,大局限的代码。所以我果断放弃。
然后,我结合题目去想,进制转化的本质就是明确一个要转化的数,和要转化的进制。
首先判断要转化的数是否大于进制数,如果小于那这个数字的要转化进制的数,就等于其本身。
否则就将这个数,对要转化的进制取余,就结果压入一个数据结构中中,然后再将这个数除以进制在赋值给本身。然后,然后一直重复操作,直至数小于进制数。然后从一个数据结构不断出的数,就是进制转化后的数。
如果我用一个数据结构模仿了栈这个先入后出的特点,不就完美的完成了这个需求吗?
说干就干,我定义了一个数组,正向存储不断取余的结果,然后在将这个数组逆输出,就是一个类似栈的操作,但是由于数组这个数据结构一般的语言以及封装到语言内部了,就免去了定义栈这个数据结构的操作。
最后实现
#include<stdio.h>
int main(){
int i,k,input;
int v[50]; i=0;
printf("请输入要转化的数(默认十进制)input");
scanf("%d",&input);
printf("目标进制k");
scanf("%d",&k);
if(input>k)
{
while(input>k){
v[i]=input%k;
input=input/k;
i++;
}
v[i]=input;
for(;i>=0;i--)
printf("%d",v[i]);
}
else
printf("%d 转化为 %d 的后的结果为 %d",input,k,input);
return 0;
}
总结
其实,有时候,要完成某一个需求,不一定要按照社会上既定的格式去做,要抓住这个需求的核心,从以经封装好的模块出发,从而完成这个需求。