【基础算法】秦九韶进制转换问题

465 阅读3分钟

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

@TOC


前言

今天我们继续学习算法,加油。这篇文章写的是# 秦九韶算法进制转换问题。希望这篇可以有幸帮助到你,码字不易,请多多支持。 在这里插入图片描述

——————————————————————————————

秦九韶算法进制转换

秦九韶算法是一种快速计算多项式值的算法,它可以用于进制转换等问题。在进制转换中,我们可以将待转换的数字看作一个多项式,并使用秦九韶算法计算它在目标进制下的值。

秦九韶算法进制转换

秦九韶算法是一种快速计算多项式值的算法,它可以用于进制转换等问题。在进制转换中,我们可以将待转换的数字看作一个多项式,并使用秦九韶算法计算它在目标进制下的值。

基本思路

假设我们要将一个 nn 位的数字 xxmm 进制转换为 pp 进制,那么我们可以将 xx 表示为:

x=a0×m0+a1×m1+a2×m2++an1×mn1x = a_0 \times m^0 + a_1 \times m^1 + a_2 \times m^2 + \cdots + a_{n-1} \times m^{n-1}

其中 aia_i 表示 xxmm 进制下第 ii 位上的数字。

如果我们希望将 xx 转换为 pp 进制,那么我们只需要将 aia_i 转换为 pp 进制,然后将它们乘以对应的权重 pip^i,最后将这些值相加即可得到 xxpp 进制下的值。

在实际计算中,我们可以使用秦九韶算法,将计算过程优化为 O(n)O(n) 的复杂度。具体来说,我们可以从低位到高位依次计算每一位上的值,并使用秦九韶算法将它们相加。对于当前位上的数字 aia_i,我们可以将之前的结果乘以 mm,然后加上当前位上的值,得到新的结果 rr。然后,我们再将 rr 乘以 ppii 次幂,即 pip^i,得到当前位上的值。最终,将所有位上的值相加即可得到 xxpp 进制下的值。

示例1

下面是一个将二进制数 1011010110 转换为八进制数的示例:

首先,将二进制数 1011010110 表示为多项式:

x=0×20+1×21+1×22+0×23+1×24x = 0 \times 2^0 + 1 \times 2^1 + 1 \times 2^2 + 0 \times 2^3 + 1 \times 2^4

然后,从低位到高位依次计算每一位上的值:

  • 当前位为 202^0 时,r=0×2+0=0r = 0 \times 2 + 0 = 0
  • 当前位为 212^1 时,r=0×2+1=1r = 0 \times 2 + 1 = 1,当前位上的值为 1×8=81 \times 8 = 8
  • 当前位为 222^2 时,r=1×2+1=3r = 1 \times 2 + 1 = 3,当前位上的值为 $3 \times 8^1 = 24

示例2

以将二进制数 101010 转换为十进制数为例,使用秦九韶算法的步骤如下:

  1. 将二进制数从低位到高位的顺序排列,得到 0 1 0 1 0 1。

  2. 设 a_n 表示二进制数的第 n 位的值,c_n 表示 2^n。

  3. 根据秦九韶算法的递推式,可以得到:

a_0 = 1
a_1 = a_0 × 2 + 0 = 2
a_2 = a_1 × 2 + 1 = 5
a_3 = a_2 × 2 + 0 = 10
a_4 = a_3 × 2 + 1 = 21
a_5 = a_4 × 2 + 0 = 42

  1. 因此,二进制数 101010 对应的十进制数为 42。

在秦九韶算法中,通过递推式快速计算了每一位的权值和该位的值的乘积,并将这些乘积相加得到最终的十进制值。这个算法可以用于任何进制的转换,只需要将递推式中的 2 换成相应的进制数即可。

C++代码:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int binary = 101010; // 待转换的二进制数
    int decimal = 0; // 十进制数的初始值为0
    int n = 0; // 记录二进制数的位数

    // 统计二进制数的位数
    int temp = binary;
    while (temp != 0) {
        temp /= 10;
        n++;
    }

    // 使用秦九韶算法计算十进制数
    for (int i = 0; i < n; i++) {
        int a = binary % 10; // 取出二进制数的最低位
        binary /= 10;
        decimal += a * pow(2, i); // 使用秦九韶算法计算十进制数
    }

    cout << "The decimal number is: " << decimal << endl;

    return 0;
}

时间复杂度:

在使用秦九韶算法进行进制转换时,时间复杂度为 O(n)O(n),其中 nn 表示待转换数字的位数。这是因为我们只需要从低位到高位依次计算每一位上的值,每次计算只需要进行一些简单的乘法和加法运算,所以总的时间复杂度是线性的。相比之下,直接使用进制转换公式的时间复杂度是 O(nlogmp)O(n \log_m p),其中 logmp\log_m p 表示 mm 进制到 pp 进制的对数,这个复杂度与 nnlogmp\log_m p 同阶,且通常情况下 logmp\log_m p 的值较大,所以秦九韶算法更加高效。

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.把时间尺度拉长,拉长十年看当下

2.不说负面情绪,只描述事实;

3.越专注于过好自己,能量和幸运越会照顾你; 只解决问题,不做没有意义的担心,输了就认;

4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了

5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!