进制转化之(数组模仿栈的特性去实现)

背景引入

        今天我跟往常一样,继续刷算法题,突然看到进制转化,能不能不使用栈去实现(如果使用栈的话,光定义栈的数据结构,和栈的各种操作,之间函数的使用)代码量有一点多。能不能有简单一点的算法。

算法设计过程

开始想法

        刚开始,我不打算使用栈来做,我打算利用不断判断的输入数的位数(一个数有几位数,例如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;
}

总结

       其实,有时候,要完成某一个需求,不一定要按照社会上既定的格式去做,要抓住这个需求的核心,从以经封装好的模块出发,从而完成这个需求。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deadline是第一生产力,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值