精华内容
下载资源
问答
  • 1、理解题目:从1960开始,每十年,翻一倍,1960年是4位,1970年是8位,1980年是16位,1990年是32位,2000年是64位。...由于指数爆炸,数字太大,因此把指数转换为对数,得出(log表示以2为底,而C++中log()是以...

    在这里插入图片描述
    在这里插入图片描述
    1、理解题目:从1960开始,每十年,翻一倍,1960年是4位,1970年是8位,1980年是16位,1990年是32位,2000年是64位。给定一个年份,就已知其对应的位数,要求的是最大数n,使得n!小于该位数。
    2、翻译过来就是1 * 2 * … * n < 2 的 (year-1960)/10+2 次方。由于指数爆炸,数字太大,因此把指数转换为对数,得出(log表示以2为底,而C++中的log()是以10为底,因此要再使用换底公式,log1=log(1.0)/log(2.0):log1+log2+…+logn < (year-1960)/10+2,求出n即可。

    代码

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main() {
    
    	int N;
    	cin>>N;
    	while(N) {
    		int bit = (N - 1960) / 10 + 2;
    		bit = 1 << bit;
    		double ans = 0.0;
    		int i = 1;
    		while(ans<bit) {
    			ans += log(double(++i)) / log(2.0);
    		}
    		cout<<(i-1)<<endl;
    		cin>>N;
    	}
    
    	return 0;
    }
    

    结果

    在这里插入图片描述

    展开全文
  • 先说明一下这里要使用的一些运算符号: '>>' 逻辑右移 ' └x┘ 对x向负无穷方向取整 ┌x┐ 对x向正无穷方向取整 ...log2(x) 取x以2为底的对数 uint32 定义unsigned int无符号32bit整数 uint64
    先说明一下这里要使用的一些运算符号:
    '>>'  逻辑右移
    '<<'  逻辑左移
    └x┘   对x向负无穷方向取整
    ┌x┐   对x向正无穷方向取整
    {x}   x的小数部分
    x^y   x的y次幂  或者  是x异或y(程序表达式中使用)
    mod(x,y)  x/y的余数
    log2(x)  取x以2为底的对数

    uint32  定义unsigned int无符号32bit整数
    uint64  定义unsigned long long无符号64bit整数

    在这里我们假设a为被除数,b为除数,且b > 1
    我们知道
    a / b
    = (1 / b) * a
    因为b>1,所以1/b是小于1的,而CPU通用寄存器只能处理整数,所以我们必须想办法把(1/b)扩大到2^e倍,也就是左移e个bit,然后把得到的结果在右移e个bit即可得到商:
    └a/b┘
    = └((2^e / b) * a) / 2^e┘
    这里e是一个大于0的整数,具体由b来确定。
    因为当b不是2的整数次幂时2^e / b不为整数,所以我们设想:
    (2^e+c)/ b,这样得到一个整数,
    所以当b不为2的整数次幂是c就等于:
    c = b - mod(2^e,b)
    b为2的整数次幂时:
    c = 0
    那么必须满足:
    └a/b┘
    =└((2^e / b) * a) / 2^e┘
    =└((2^e+c)/ b) * a / 2^e┘
    =└a / b + c*a/(b*2^e)┘
    很明显只有当:
    c*a/(b*2^e) < 1/b
    =>
    c*a < 2^e 时有:
    └a / b + c*a/(b*2^e)┘
    =└a/b┘
    例:
    当:
    b = 3 时
    如果e = 32
    c = 3 - mod(2^32,3)
    = 2
    此时a为最大值2^32-1时,不满足:
    c*a < 2^e
    如果e = 33
    c = 3 - mod(2^33,3)
    = 1
    此时满足:
    c*a < 2^e
    并且因为3 > 2,所以当e = 33,不会使
    ((2^e+c)/b) * a
    超出 64bit而溢出,所以e = 33成立;
    C语言可描述为:
    uint32 a,b,r;
    a = 被除数;
    b = 0xAAAAAAAB; // b = (2^33 + 1) / 3
    r = ((uint64)a * b) >> 33; //此时r中就是a/3的商

    当:
    b = 5 时
    可以使用e = 34;

    当:
    b = 7 时
    e = 32,33,34时都无法满足
    c*a < 2^e
    如果e = 32,那么
    c = 3
    为使c*a < 2^e
    a最大就只能为0x55555555
    当超出时就有可能使结果比实际商大1,
    但如果让a加上这个商试试,

    C语言描述为:

    uint32 a,b,t,r;
    a = 被除数;
    b = 0x24924925; // b = (2^32 + 3) / 7
    t = ((uint64)a * b) >> 32;
    r = (a + t) >> 3; //如果(a + t)不溢出,这将是结果
    因为a >= 7*T,T为实际商,得:
    7*T <= a <= 7*T+6
    =>
    7*T+t <= a+t <= 7*T+6+t
    =>
    8*T <= a+t <= 8*T+6+1 < 8*(T+1)
    =>
    └(a+t)/8┘ = T
    所以(a + t) >> 3含义成立,
    但(a + t)有可能产生溢出,改进一下得:
    (a + t) >> 3
    = ((a + t) >> 1) >> 2
    = └(a + t) / 2┘ >> 2
    = └(a-t + 2t) / 2┘ >> 2
    = (└(a-t)/2┘+t) >> 2
    = (((a-t) >> 1) + t) >> 2
    这样就可以不担心溢出了,最后
    r = (((a-t) >> 1) + t) >> 2;
    看了上面几个数的除法实现,应该有了一个初步的了解,现在我们来构造一个通用的算法来求其e,知道了合适的e,一切都好办了。
    一些数字可以对e满足((2^e+c)/ b) * a不超过64bit时有:
    c*a < 2^e
    但还有一些数则无法办到,所以我们退其次,我们让((2^e+c)/ b) * a可以为65bit,这样我们将永远满足:
    c*a < 2^e
    因为:
    a*(2^e+c)/b <= 2^64-1
    =>
    (2^e+c)/b <= (2^64-1)/(2^32-1)
    =>
    (2^e+c)/b <= 2^32+1
    当c=0时:
    2^e / b为整数,
    =>
    2^e / b <= 2^32+1
    =>
    e <= └log2(b) + log2(2^32+1)┘
    =>
    e <= log2(b) + 32
    当c!=0时:
    =>
    2^e / b < 2^32+1
    =>
    2^e < b*(2^32+1)
    =>
    e <= ┌log2(b) + log2(2^32+1)┐ - 1
    =>
    e <= └log2(b) + log2(2^32+1)┘
    =>
    e <= └log2(b)┘ + 32
    结合两次分析最终得:
    e <= └log2(b)┘ + 32

    ((2^e+c)/ b) * a
    不超过64bit,
    现在我们使用:
    e = └log2(b)┘ + 33来完成
    ((2^e+c)/ b) * a
    这样此式的结果最高就为65bit了,((2^e+c)/ b)就是33bit。

    但((2^e+c)/ b)在一个寄存器中最多只能表示32bit的数,还有一个最高bit暂时忽略,只要其低32bit,然后我们在结果的高32上加一个a,这样我们就得到了正确结果的低64bit,C语言描述为:

    uint32 a,b,t,r;
    a = 被除数;
    b = 0x********;//b = (2^(e+33)+c)/b, e = └log2(b)┘
    t = ((uint64)a * (uint64)b) >> 32;
    r = (a + t) >> (e+1);//商
    刚刚已说(a + t)可能溢出,换一种表达式来表示:
    (a + t) >> 1
    = └(a + t) / 2┘
    = └(a-t + 2t) / 2┘
    = └(a-t)/2┘+t
    = (a - t) >> 1 + t
    最终r = ((a - t) >> 1 + t) >> e
    这样就不会担心中间结果溢出了。
    下面是为上述而设计的一个C语言程序:
    typedef unsigned int uint32_t;
    typedef int int32_t;
    typedef unsigned long long uint64_t;
    
    #define is2exp(x) (((x - 1) & x) == 0)//检测x是否为2的整数次幂
    
    uint32_t log2x(uint32_t x)
    {
    //└log2(x)┘ , x>0
    //求小于等于x以2为底的对数的最大整数
     int32_t e;
     for (e = 31; e >= 0; e--) {
      if ((int32_t)x < 0) return e;
      x <<= 1;
     }
     return -1;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
     uint32_t b,c,i;
     b = 21;//除数,b > 1
     for (i = 0; true; i++) {
      c = b - ((uint64_t)1 << (32+i)) % b;
      if (c == b) {
       c = 0;//此时b为2的整数次幂
       break;
      } else if (is2exp(c)) {
       if (log2x(c) <= i) break;
      } else {
       if (log2x(c) < i) break;
      }
     }
     uint32_t e,db;
     e = log2x(b);
     db = (((uint64_t)1 << (32+i)) + c) / b;//当i = e+1时取结果的低32bit
     printf("当除数为 %d 时:/n",b);
     if (i <= e) {
      printf("商 = ((uint64_t)被除数 * 0x%x) >> %d",db,32+i);
     } else {//i = e + 1时就说明在 e <= └log2(b)┘内无法完全满足c*a < 2^(e+32)
      printf("t = ((uint64_t)被除数 * 0x%x) >> 32/n",db);
      printf("商 = ((((uint64_t)被除数 - t) >> 1) + t) >> %d",e);
     }
     getchar();
     return 0;
    }

    测试:
    如果b = 21将输出:
    当除数为 21 时:
    t = ((uint64_t)被除数 * 0x86186187) >> 32

    商 = ((((uint64_t)被除数 - t) >> 1) + t) >> 4


    注:记不得是哪里的文章了,经过整理。

    展开全文
  • python log函数

    2020-11-27 18:12:30
    impoort numpy as np from math import e import math # 自然数e为底的对数 a = np.log([1,np.e,np.e**2]) # [0,1,2] # 类型是 np.array # 10 为底的对数 b = np.log10([1,10,1000]) #[0,1...# 2 为底的对数
    impoort numpy as np
    from math import e
    import math
    
    # 以自然数e为底的对数
    a = np.log([1,np.e,np.e**2])  # [0,1,2]  # 类型是 np.array
    
    # 以 10 为底的对数 
    b = np.log10([1,10,1000])     #[0,1,3]  #  类型是 np.array
    c = np.log10(10000)           # 4  # 类型是np.float64
    
    # 以 2 为底的对数
    d = np.log2([1,2,4,8])       #[0,1,2,3]  
    c = type(d.shape)            # tuple
    
    

    参考链接:
    https://blog.csdn.net/langjijianghu_123/article/details/79022428

    展开全文
  • 11.4.1 以2为底的整数对数 253 11.4.2 以10为底整数对数 253 11.5 习题 257 第12章 以特殊值为底数制 258 12.1 以-2为底数制 258 12.2 以-1+i为底数制 264 12.3 以其他数为底数制 266 12.4 最高效...
  • 中文版Excel.2007图表宝典 2/2

    热门讨论 2012-04-06 19:01:36
    12.2.3 百分比变化和实际变化形式绘图/321 12.2.4 Bin大小不等分组/321 12.3 图表类型选择问题/322 12.3.1 分类坐标轴和值坐标轴/322 12.3.2 使用饼图问题/323 12.3.3 考虑可选图表类型/326 12.3.4 使用...
  • 本书是第I卷,开发人员在项目开发中经常遇到问题和必须掌握技术中心,介绍了应用PHP进行Web开发各个方面知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向...
  • 2.3.4 LOG——计算指定数字为底的对数 81 2.3.5 LOG10——计算10为底的对数 82 2.4 阶乘、矩阵与随机数 83 2.4.1 COMBIN——计算给定数目对象的组合数 83 2.4.2 COMBINA——计算给定数目对象具有重复项的...
  • 返回一个n1为底n2的对数 SQL> select log(2,1),log(2,4) from dual; LOG(2,1) LOG(2,4) --------- --------- 0 2 26.MOD(n1,n2) 返回一个n1除以n2的余数 SQL> select mod(10,3),mod(3,3),mod(2,3) from ...
  • 程序员二进制计算器 v1.36

    热门讨论 2014-07-16 16:21:43
    程序员打造计算器,二进制运算强大,支持64位。 采用表达式驱动,输入表达式便即时显示结果,抛弃传统计算器繁琐按钮,表达式可粘贴或回调重复使用。 支持二进制串直接运算,如0b1101 & 0b0011= 0b0001。 ...
  • 3.3.3 log10/log2 常用对数/ 2 为底的对数/79 3.3.4 fix/round/ceil/floor 取整函数/81 3.3.5 mod/rem 取模数/余数/81 3.4 图形相关函数/82 3.4.1 plot 绘制二维图像/82 3.4.2 坐标轴设置函数/83 3.4.3 subplot ...
  • 一个计算机教师教学场景,讲解数据结构和相关算法知识。通篇一种趣味方式来叙述,大量引用了各种各样生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到一些经典算法做到逐行分析、...
  • 一个计算机教师教学场景,讲解数据结构和相关算法知识。通篇一种趣味方式来叙述,大量引用了各种各样生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到一些经典算法做到逐行分析、...
  • 本书是第I卷,开发人员在项目开发中经常遇到问题和必须掌握技术中心,介绍了应用PHP进行Web开发各个方面知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向...
  • c语言经典案例

    2014-10-30 08:06:57
    实例053 自然对数的底e计算 70 实例054 满足abcd=(ab+cd)2的数 70 实例055 整数加减法练习 71 实例056 判断整倍数 73 实例057 阶梯问题 73 实例058 乘积大于和数 74 实例059 求各位数之和5数 75 第6章 数据...
  • 大话数据结构

    2019-01-10 16:35:22
    简单说,就是把我们要压缩文本进行重新编码,达到减少不必要空间技术。压缩和解压缩技术就是基于赫夫曼研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3...
  • 大话数据结构 程杰

    2018-09-01 10:06:43
    简单说,就是把我们要压缩文本进行重新编码,达到减少不必要空间技术。压缩和解压缩技术就是基于赫夫曼研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3...
  • 3.8.1 单链表插入 61 3.8.2 单链表删除 64 3.9 单链表整表创建 66 3.10 单链表整表删除 69 3.11 单链表结构与顺序存储结构优缺点 70 3.12 静态链表 71 对于一些语言,如Basic、Fortran等早期编程高级语言...
  • 实例163 自然对数的底e计算 237 实例164 最大公约及最小公倍数 238 实例165 求解二元一次不定方程 239 实例166 二分法求解方程 241 实例167 牛顿迭代法解方程根 242 5.4 矩阵 243 实例168 打印特殊...
  • 大话数据结构-程杰

    2014-07-13 23:45:52
    简单说,就是把我们要压缩文本进行重新编码,达到减少不必要空间技术。压缩和解压缩技术就是基于赫夫曼研究之上发展而来,我们应该记住他。 6.12.1 赫夫曼树 200 6.12.2 赫夫曼树定义与原理 203 ...
  • <p><strong>sort方法是对数元素排序。参数<code>sortFn可选,其规定排序顺序,必须是函数。 </li></ul> <pre><code>javascript let values = [0, 1, 5, 10, 15]; values.sort(); console.log...
  • 德力西产品说明.pdf

    2019-10-10 18:41:58
    2、本机铭牌所标注额定值是否与您订货要求一致,箱内是否包含您订购机器、产品合格证、用户操作手册及保修单。   本公司在产品制造及包装出厂方面,质量保证体系严格,但若发现有某种检验遗漏,请速与本...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

以2为底64的对数