十进制转八进制的一种思路

前言

我们先看本次分析的源代码

image-20230220224954005

不得不承认,在没有人指导的情况下,我感觉但从代码出发思路还是比较难以琢磨出来的。想要搞出来还是要从单一案例出发,研究其中的数学逻辑,多演草,尽可能去寻找数与数之间的关系。

正文

先从代码分析

该代码主要分为两个部分

第一部分用来找出一个小于输入值的最大8次方数

image-20230220225320656

第二部分用通过依次输出单一数字(某一位上的数字)来组合出我们的答案

与正常计算方式对比

我们正常计算十进制转八进制问题时,我们的一般步骤是:将10进制数一直除8,取每次余数,最后将这些余数逆序组合得出答案。

其中的逆序组合是最关键的问题,我们可以通过存入数组中来实现,但是这个代码并不这样做,所以我们要重点分析他是怎么解决的。

分析八进制

我们以115来举例,正常计算结果如下

image-20230220225810875

那么我们进行逆向分析,将这个八进制转换为十进制,看看会是一个什么过程

image-20230220230838272

这里我们就可以发现端倪了:这个式子实际上就是3+48+64=115,我们从这个式子中也能发现,115实际就是64、8、0的组合。首先去找64得到1,然后去找8,然后去找3。我们对这个式子逆推是显然成立的,如果逆推的时候数值存在偏差,那么正向式子就显然不满足除到底的要求。

重审代码

所以,面对十进制转八进制问题,我们需要先找出那个小于输入值的最大8次方数(再大的那些数据显然放在式子里是乘0的),然后向小的方向求出其他8的次方数。对于115的情况就是先得出64,然后找到8。

先用64去除,拿他的结果。剩下的余数要靠更小的8的次方数去组成。这样一直进行到8结束,剩下的就交给1来凑了。

后记

盘盘数学逻辑

起因

前言和正文都是2/20晚上写的,本来问题基本已经解决了。但是今天(2/21)中午睡午觉的时候,寝室有点吵没咋睡成,睡了10分钟左右就被干醒了,在意识有点模糊的时候想到了这个问题,我想着反正睡不着就在床上再想想这个问题,然后我就在半睡半醒的情况下把数学逻辑给盘出来了。于是我就直接起床写下来这份后记。

看看我当时思考的问题切入点:上面我们是通过对八进制转十进制的分析得出的思路,那么我开始好奇十进制转八进制八进制转十进制在方法上有什么数理逻辑,为什么相互转换的方式不一样,为什么不一样但是是可以逆向转换的。

这个问题如果去网上搜应该会有教学视频,但我觉得我自己思考出来的结果也很宝贵,所以请听我讲讲我当时的分析。

分析

我们还是以115为例子看看两个式子

image-20230221132411866

为什么十进制的余数可以作为答案呢?我们上面的程序是将除法结果依次输出,而正常运算是将除法余数依次输出。于是我结合正文中我提到的逆向分析思路做出下面的分析。

我们换个形式来看十进制转八进制的式子

image-20230221133115607

那么现在我们对右边式子进行整合

image-20230221133752434

然后将括号去掉,看看变成了什么

image-20230221133823134

如果我们将这个式子进行翻转,那么就变成了我们八进制转十进制的式子了。

此时数理逻辑就清晰起来了

总结

我们对于十进制转八进制式子中的余数,不应该单单认为他是一个个位数,还要清楚它背后跟着隐藏的乘法。

比如115中的余数3、6、1,1的背后其实藏着两个8,因为他是在经过两次除8后进行第三次除8产生的余数,那么这也意味着它代表了前两次的8,如果进行逆推,那么它理应去乘两次8。其他分析同理。

posted @ 2023-02-20 23:10  Zaughter  阅读(333)  评论(0编辑  收藏  举报