zoukankan      html  css  js  c++  java
  • 快速幂

      # 2018-07-29  update

      用字符输入二进制数据:

    #include <iostream>
    // 计算x的n次方的函数
    long int expo(long int base, unsigned int n)
    {
    	if (n == 0)
    		return 1;
    	else if (n & 1)
    		return expo(base*base, n >> 1);
    	else
    		return expo(base, n - 1)*base;
    }
    int char2int(const char* str)
    {
    	int sum = 0, len = strlen(str);
    	for (unsigned int i = 0; i < len; i++)
    		sum += (str[i] - '0') * expo(2, len - i - 1);
    	return sum;
    }
    int main()
    {
    	char bi[64];
    	std::cout << "请输入二进制数:";
    	std::cin >> bi;
    	int sum = char2int(bi);
    	std::cout << "(" << bi << ")B = (" << sum << ")D" << std::endl;
    	return 0;
    }

      顺便提一下long long 型的输出方式,代码:

    printf("(%s)B = (%I64d)D
    ", binary, sum);
    

      windows上使用%ld输出则会有警告,这样就不会了...%ld是在Linux上的输出方式。

      顺带说说快速幂算法。上面求 $ x^n $ 代码就是递归版的快速幂算法,主要原理用例子来解释就明白了:

      例如 $ 2^8 $,假如像下面这样写算法效率会很低:

    a = 2, b = 8, c = 1;
    while (b--) c *= a;
    

      我们可以这样优化,直觉上能看到对偶数个2相乘进行分组会更快:

    $$ egin{aligned} 2^8 &= ((2*2)*(2*2))*((2*2)*(2*2)) \ &= (4*4)*(4*4) \ &= 16*16 end{aligned} $$

      这就是递归算法的原理,当然还可以转化成迭代形式:

    #define ll long long
    ll expo(ll a, ll b)
    {
        ll res = 1; while (b > 0)
        {
            if (b & 1)
                res = (res * a);
            a = (a * a);  b >>= 1;
        }
        return res;
    }
    

      更多的关于快速幂算法请移步:https://en.wikipedia.org/wiki/Exponentiation_by_squaring

  • 相关阅读:
    Android应用视觉效果设计技巧
    Android实现图片缩放与旋转
    schema 对象的简单介绍
    Index Scans 索引扫描
    Oracle Database Transaction Isolation Levels 事务隔离级别
    第一篇博客,纪念一下,终于开通啦!
    Linux 开机引导流程
    springBoot中tomcat默认端口修改
    面向服务架构之RPC原理与实例
    vs2008中xlslib与libxls库的编译及使用
  • 原文地址:https://www.cnblogs.com/darkchii/p/7376167.html
Copyright © 2011-2022 走看看