变治法 二进制幂

从左至右二进制幂算法

#  include <stdio.h>
int leftRightBinaryExponentiation(int a, int b[4]);
int rightLeftBinaryExponentiation(int a, int b[4]);
//计算2的十三次方  1101 是13的二进制表达
void main()
{
    int B[]={1, 1,0, 1 };
        int C[]={1, 0,01, 1 };
    int a=2;
     printf("%d\n",    leftRightBinaryExponentiation(a,B) );
     printf("%d\n",    rightLeftBinaryExponentiation(a,B) );
}

    /**
     *
     * 如 a^13 = a^(1*2^3 + 1*2^2 + 0*2^1 + 1*2^0)
     *
     * @param a底数
     *
     * @param b 幂二进制霍纳表达式(数组顺序幂次高到底)
     */
//从左至右二进制幂
int leftRightBinaryExponentiation(int a, int b[4])
{
        int product = a;
        int i;
        // b[0]一定为1(要么为1,要么为0),因为它是最高位系数,最高位系数只能是1
        for ( i = 1; i <4; i++)
        {
            product = product * product;

            if (b[i] == 1)
                product *= a;
        }

        return product;
}

    /**
     *
     * 如 a^13 = a^(1*2^3 + 1*2^2 + 0*2^1 + 1*2^0)
     *
     *  a   底数
     *
     *  b   幂二进制霍纳表达式(数组顺序幂次高到底)
     *
     * @return
     */
   //从右至左二进制幂
    int rightLeftBinaryExponentiation(int a, int b[4])
    {
        int i;
        int product =1;
        int term = a;

        for ( i =3; i >=0 ; i--)
        {

            if(b[i] == 1)
                product *=term;
            term *= term;

        }

        return product;
    }

从右至左算法 :term的初始值为a。第一次循环结束之后为a的平方,第二次循环结束为a的四次方。一次类推。。。。每一次循环是否乘以a看数组B是否为1,是1则乘以a。

时间: 2025-01-05 02:24:16

变治法 二进制幂的相关文章

算法笔记005:堆排序【变治法】

目录 1 问题描述 2 解决方案  2.1  堆排序原理简介 2.2  变治法原理简介 2.3  具体编码 2.4  运行结果截图 1 问题描述 (1)实验题目 用基于变治法的堆排序算法对任意一组给定的数据进行排序 (2)实验目的 1)深刻理解并掌握变治法的设计思想: 2)掌握堆的概念以及如何用变治法把任意给定的一组数据改变成堆: 3)提高应用变治法设计算法的技能. (3)实验要求 1)设计与实现堆排序算法: 2)待排序的数据可以手工输入(通常规模比较小,10个数据左右),用以检测程序的正确性:

变治法

1预排序 优化:及时回溯 排序过程中的语义 应用:唯一元素,最多元素, 2.高斯消元 矩阵运算相关,先跳过 3.AVL树 每个节点维护一个平衡因子:左子树高度-右子树高度 AVL树失去平衡,旋转 旋转平衡因子+-2的节点 旋转保证满足定义 保持二叉树 恢复平衡 删除的效率低 灵感:旋转树,不破坏结构,保持平衡 因为avl树不是太有用就不记了,但可以总结下 左右是相对的,所有旋转情况可分为对称的两部分,只需考虑一半情况 父节点将子树划分为两个区间 简单旋转可能破坏二叉结构,则选择上提动作 旋转与上

UVA 11582 - Colossal Fibonacci Numbers!(数论)(分治法幂取模)

巨大的斐波那契数! 题目大意:斐波那契数列f[N],给你a,b,n,求f[a^b]%n. 思路:数论题.f[a^b]%n是有周期的,我们求出来这个周期后就可以将简化成f[(a%周期)^b]%周期运用分治法幂取模. 注意用unsigned long long(貌似是 long long的二倍),不然会溢出,又学了一招... 不知道哪的bug,一直改不对,一直,后来捡来别人的和自己一样的代码一改就对了,,, #include<iostream>//UVA #include<cstdio>

数据库中用varbinary存储二进制数据

问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先要把varbinary搞懂了,其次就是图片类型与二进制类型之间的转换,文件类型与二进制类型之间的转换. 准备工作:     1.varbinary 与 binary的区别:             固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型.    

mysql二进制类型

二进制类型 包括BINARY.VARBINARY.BIT.TINYBLOB.BLOB.MEDIUMBLOB.LONGBLOB BINARY(M)类型,保存的是字节而不是字符,没有字符集限制,字节数为M,允许长度为0~M的定长二进制字符串.不足最大指定长度的空间由"\0"补全,查询时也要包含"\0",不然查找不到.进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速,按字符(char)比较不区分大小写,而binary区分大小写. VARBIN

sqlserver字段类型

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

2017校招常考算法题归纳&amp;典型题目汇总

2017校招即将来临,我们为大家整理了2017校招的常考算法类型,以及对应的典型题目. 另附参考答案地址:http://www.jiuzhang.com/solution/ 数学 尾部的零 斐波纳契数列 x的平方根 x的平方根 2 大整数乘法 骰子求和 最多有多少个点在一条直线上 超级丑数 比特位操作 将整数A转换为B 更新二进制位 二进制表示 O(1)时间检测2的幂次 二进制中有多少个1 动态规划 编辑距离 正则表达式匹配 交叉字符串 乘积最大子序列 二叉树中的最大路径和 不同的路径 通配符匹

【DataBase】sqlserver字段类型详解

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

sqlserver字段类型详解

抄了一篇不错的数据库类型,来自:http://www.cnblogs.com/andy_tigger/archive/2011/08/21/2147745.html bit 整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint 整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值