求2的n次方首位数的问题?

yan198 2009-09-20 01:21:37
如题~
...全文
1367 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
helihui123 2010-02-21
  • 打赏
  • 举报
回复
31楼的觉得有道理 +eps 精度就行了
xiaohu9711 2009-10-04
  • 打赏
  • 举报
回复
哈哈,楼上的回答正确哦
FancyMouse 2009-10-04
  • 打赏
  • 举报
回复
>第一要求就是准确, 如果用上面的取log的方法,在n很大的时候,是很难真正的准确的。
要使得n!的前3位是999,n已经要非常大了。所以在正常应用范围里取log没问题
zeroieme 2009-10-04
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 zeroieme 的回复:]
前三项分别是 1000^m、m*1000^(m-1)*24、m(m-1)/2 *1000^(m-2)*24^2
同时除以1000^m,分别是 1、24*m/1000、576*(m(m-1)/2)/(1000^2)
相加求和为 1+0.023424*m+0.000576*m^2
[/Quote]
原多项式展开时少算个m(m-1)/2
更正为 1+0.023712*m+0.000288*m^2
zhaigates 2009-10-03
  • 打赏
  • 举报
回复
不错
zeroieme 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 pioneer604 的回复:]
兄弟,思路不错,不过你的前三项之和很容易超出数据类型表示范围,这题不如对数方法实用,画个杨辉三角不如直接按二项式展开来得快,如果前三项中能够根据M的大小忽略部分1000的幂,只取前三项的有效数字相加,如果这种方法行得通,我觉得是一个好办法
引用 57 楼 zeroieme 的回复:
设n/10=m余数k
2^n
=2^(10*m+k)
=(2^10)^m*(2^k)
=1024^m*(2^k)
=(1000+24)^m  *  (2^k)
后者1、2、4、8、16、……512
前面用《杨辉三角》展开, 取前3项之和与(2^k)相乘。

[/Quote]
杨辉三角当然是用二项式系数公式。凑个1024、取展开式前3项之和当然为了简化1000的乘幂后面的N个零。
就是这个意思,你都补充完了
pioneer604 2009-10-03
  • 打赏
  • 举报
回复
哦,明白了
[Quote=引用 63 楼 zeroieme 的回复:]
前三项分别是 1000^m、m*1000^(m-1)*24、m(m-1)/2 *1000^(m-2)*24^2
同时除以1000^m,分别是 1、24*m/1000、576*(m(m-1)/2)/(1000^2)
相加求和为 1+0.023424*m+0.000576*m^2

总结为
设 n/10=m余数k
则2^n 的首位数与(1+0.023424*m+0.000576*m^2)* 2^k 相同


取前三项是因为乘数(2^k) 部分可能有三位有效数字,所以(2^10)^m也保证三位有效数字的精度。
[/Quote]
zeroieme 2009-10-03
  • 打赏
  • 举报
回复
更正为
则2^n 的首位数与(1+0.023424*m+0.000576*m^2)* 2^k 的首位数 相同
zeroieme 2009-10-03
  • 打赏
  • 举报
回复
前三项分别是 1000^m、m*1000^(m-1)*24、m(m-1)/2 *1000^(m-2)*24^2
同时除以1000^m,分别是 1、24*m/1000、576*(m(m-1)/2)/(1000^2)
相加求和为 1+0.023424*m+0.000576*m^2

总结为
设 n/10=m余数k
则2^n 的首位数与(1+0.023424*m+0.000576*m^2)* 2^k 相同


取前三项是因为乘数(2^k) 部分可能有三位有效数字,所以(2^10)^m也保证三位有效数字的精度。
pioneer604 2009-10-03
  • 打赏
  • 举报
回复
只是光取前三项的话数值仍然太大,我的意思能不能进一化简化
[Quote=引用 60 楼 zeroieme 的回复:]
引用 59 楼 pioneer604 的回复:
兄弟,思路不错,不过你的前三项之和很容易超出数据类型表示范围,这题不如对数方法实用,画个杨辉三角不如直接按二项式展开来得快,如果前三项中能够根据M的大小忽略部分1000的幂,只取前三项的有效数字相加,如果这种方法行得通,我觉得是一个好办法
引用 57 楼 zeroieme 的回复:
设n/10=m余数k
2^n
=2^(10*m+k)
=(2^10)^m*(2^k)
=1024^m*(2^k)
=(1000+24)^m  *  (2^k)
后者1、2、4、8、16、……512
前面用《杨辉三角》展开, 取前3项之和与(2^k)相乘。


杨辉三角当然是用二项式系数公式。凑个1024、取展开式前3项之和当然为了简化1000的乘幂后面的N个零。
就是这个意思,你都补充完了
[/Quote]
pioneer604 2009-10-02
  • 打赏
  • 举报
回复
兄弟,思路不错,不过你的前三项之和很容易超出数据类型表示范围,这题不如对数方法实用,画个杨辉三角不如直接按二项式展开来得快,如果前三项中能够根据M的大小忽略部分1000的幂,只取前三项的有效数字相加,如果这种方法行得通,我觉得是一个好办法
[Quote=引用 57 楼 zeroieme 的回复:]
设n/10=m余数k
2^n
=2^(10*m+k)
=(2^10)^m*(2^k)
=1024^m*(2^k)
=(1000+24)^m  *  (2^k)
后者1、2、4、8、16、……512
前面用《杨辉三角》展开, 取前3项之和与(2^k)相乘。
[/Quote]
Freedom 2009-10-02
  • 打赏
  • 举报
回复
为什么要着样做啊 挺麻烦的啊,我觉得先求出2的n次方等于多少,在用它对10取整就是了 比如
128对10取整,只要取整后的数不等于0就是了 循环判断条件
while(n!=0)
zeroieme 2009-10-02
  • 打赏
  • 举报
回复
设n/10=m余数k
2^n
=2^(10*m+k)
=(2^10)^m*(2^k)
=1024^m*(2^k)
=(1000+24)^m * (2^k)
后者1、2、4、8、16、……512
前面用《杨辉三角》展开, 取前3项之和与(2^k)相乘。
liusujian02 2009-10-02
  • 打赏
  • 举报
回复
学习!
pioneer604 2009-10-01
  • 打赏
  • 举报
回复
大兄弟,这么高明的公式真悟不出来,还是指点一下吧
[Quote=引用 54 楼 yangfan227 的回复:]
这个题有公式的,就是O(1)算法了。
提示,先将2^n的10进制表达式写出来,然后楼主在研究研究,值得你去研究的。
[/Quote]
yangfan227 2009-10-01
  • 打赏
  • 举报
回复
这个题有公式的,就是O(1)算法了。
提示,先将2^n的10进制表达式写出来,然后楼主在研究研究,值得你去研究的。
twilightgod 2009-09-29
  • 打赏
  • 举报
回复
ls这个问题就是原问题.....

对于n比较小用暴力
大一点的话用对数精度应该ok
p.s. 当时这题是打表过去的
kfanffvga 2009-09-29
  • 打赏
  • 举报
回复
这个问题可否考虑下10进制和2进制的数的转换问题,因为在2进制中,2^n是1后面跟着n个0,我们只要想清楚怎么把前面几位数转换成10进制就可以了
unierror 2009-09-28
  • 打赏
  • 举报
回复
这个控制下范围,每算一次都除10取整一下
linren 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 hztlfwd 的回复:]
【运行结果】
Assembly code2^1-->22^2-->42^3-->82^4-->22^5-->32^6-->62^7-->12^8-->32^9-->52^10-->1
Press any key to continue
[/Quote]
2^4-->2也不对啊
[/Quote]
嗯……
正确的程序是在31楼……
加载更多回复(49)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧