进制转换c语言代码_LeetCode基础算法题第134篇:如何将一个十进制数转换成7进制...

5e06ca2924e94a295e6cf21dd1d0b1c4.png

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

LeetCode 504. 十进制转换成7进制(Base 7)

问题描述:

给定一个整数,将其转换成7进制的字符串表示形式。

注:

输入整数在区间[-1e7, 1e7]内。

示例:

89ff1fee65919359b3163044f2b386b0.png

C语言实现:

学过计算机原理的小伙伴都应该知道,10进制N到某2进制的转换过程就是:

  1. 初始化空序列res;
  2. 计算 N % 2 并追加到序列res的开头;
  3. 将N/2的商取整作为新的N;
  4. 重复第2~3步的操作,直到N等于0;

对于7进制这个步骤是一样的,仅仅需要将上面步骤的2替换为7即可。

关于正整数的转换很简单,按照上面步骤直接循环转换即可。

由于上面步骤0作为临界条件,所以当num为0时要单独处理。

当num为负数时,要先将其转换成正数再处理,符号的追加放最后。

既然说到负数,我想说一个题外话,关于负数的除法:

python和C,java的除法是不同的(这里说的除法都是整数除法,与python的"/"除法无关)。

C和Java的除法是直接截断,丢弃后面的小数部分,所以-6/5==-1 余 -1; 而python在做这个计算的时候,是对结果进行下取整,所以结果是-6//5=-1 余 4。如果还不知道的小伙伴们要注意了。

处理流程说完了,再说说存储的问题。

我们发现在整个转换过程中,res的长度是在不断变化的。理想的情况下,我们期望能动态的改变字符串的长度,但是对于某些语言这么做可能不太方便。

对于C语言来说不断变换字符串的长度会产生额外的开销。

其实一个整数转换成7进制,字符串的长度其实是有限的。当N取32位最小负整数时,算上符号,7进制的长度也仅仅只有13位。因此我们初始化一个长度是14的字符串完全足够了。

在转换的过程中,低位的先产生,再接着产生高位的。在添加高位字符的时候为了避免移动低位字符产生开销,我的方法是从res的倒数第二个位置(字符串应该以'0'结尾)开始向左追加字符。等待转换完成后修改res的起始指针即可。

详细代码如下:

7694d265a5366ad4332df5f213812ee6.png
35cf3bb504ca36b4cd1488e6022d9b75.png

除了用循环外,我们发现,转换的任务重复且简单,也很容易用递归的方式实现。

Java语言实现:

Java 的Integer的toString静态方法,可以将一个整数转换成任意进制的数,所以我们可以用一行代码直接产生结果。代码如下:

1f6a8d397a9f1ad9bfff91b7a6c3f825.png
29015d3a404c06944fdddc227789f748.png

Python语言实现:

Python 的实现我是递归实现的,当然你依然可以用循环来做。代码如下:

f912858f5f0492840fd54f760c1267d0.png
3c798262994497def90b04380c608238.png

谢谢大家一直以来的关注和支持!

我一直在努力的写好每一篇文章,画好每一份插图。但是作为一个996从业人员,时间精力十分有限。所以针对评论部分,以后只回答粉丝的问题和私信。希望仅仅是路过的朋友能够体谅,希望更多人关注《吾是我师》,谢谢!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值