社区
C#
帖子详情
散分,也要有技术含量……
james_hunter
2007-05-17 09:47:29
这两天手上的工作被block住了(客户的原因),有点无所事事。除了自己看看书,大多时间就泡在CSDN回答问题了。有点无聊……
随便出个算法题,有兴趣的和我一样无聊的朋友作作看,有分送,不够可以另外开贴加。纯顶的就按不给分了,说点精辟的有趣的东西的,按心情给。
题目如下:
输入一个整数n,请计算2^1+2^2+2^3...2^n;
...全文
854
54
打赏
收藏
散分,也要有技术含量……
这两天手上的工作被block住了(客户的原因),有点无所事事。除了自己看看书,大多时间就泡在CSDN回答问题了。有点无聊…… 随便出个算法题,有兴趣的和我一样无聊的朋友作作看,有分送,不够可以另外开贴加。纯顶的就按不给分了,说点精辟的有趣的东西的,按心情给。 题目如下: 输入一个整数n,请计算2^1+2^2+2^3...2^n;
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
54 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
killlkilll
2007-05-18
打赏
举报
回复
输入的n 就是2进制的位数
所以
答案是
1.....(n-1).....10
至于怎么得到这个数呢
方法很多的
看高手们的了
kingyan1985
2007-05-18
打赏
举报
回复
珍藏~~
Copy了
james_hunter
2007-05-18
打赏
举报
回复
这段话也是原作者说的:
阶乘,是求一组数列的乘积,其效率的高低,一、是取决于高精度乘法算法,二、是针对阶乘自身特点算法的优化。
前者,是一种广为习知的技术,虽然不同算法效率可天壤之别,但终究可以通过学习获得,甚至可用鲁迅先生的“拿来主义”;
后者,则有许多的发展空间,这里我将介绍一种由我完全独创的一种方法,欢迎大家讨论,如能起到“抛砖引玉”的效果,那就真正达到了目的。
我在开发“阶乘”类算法时,始终遵循如下原则:
参与高精度乘法算法的两数,大小应尽可能地相近;
尽可能将乘法转化为乘方;
尽可能地优先调用平方;
james_hunter
2007-05-18
打赏
举报
回复
一早来揭帖了。
大数表示已经有答案了,我就不献丑了,把数学分析部分的内容贴出来,先声明,是转载的,原作者是HugeCalc (??,好像是他的软件的名字。下边分析的思想不仅可以用到阶乘,所以我觉得很有用):
记 F1(n) = n*(n-1)*...*1;
F2(n) = n*(n-2)*...*(2 or 1);
Pow2(r) = 2^r;
有 F1(2k+1) = F2(2k+1) * F2(2k)
= Pow2(k) * F2(2k+1) * F1(k),
F1(2k) = Pow2(k) * F2(2k-1) * F1(k),
及 Pow2(u) * Pow2(v) = Pow2(u+v),
∴ 1000! = F1(1000)
= Pow2(500)*F2(999)*F1(500)
= Pow2(750)*F2(999)*F2(499)*F1(250)
= Pow2(875)*F2(999)*F2(499)*F2(249)*F1(125)
= Pow2(937)*F2(999)*F2(499)*F2(249)*F2(125)*F1(62)
= Pow2(968)*F2(999)*F2(499)*F2(249)*F2(125)*F2(61)*F1(31)
= Pow2(983)*F2(999)*F2(499)*F2(249)*F2(125)*F2(61)*F2(31)*F1(15)
= ...
如果你预存了某些小整数阶乘(比如这里的“F1(15)”),则可提前终止分解,否则直至右边最后一项为“F1(1)”为止;这样,我们将阶乘转化为2的整数次幂与一些连续奇数的积(或再乘以一个小整数的阶乘);
再定义:F2(e,f) = e*(e-2)*...*(f+2),这里仍用“F2”,就当是“函数重载”好了:),
则 F2(e) = F2(e,-1) = F2(e,f)*F2(f,-1) (e、f为奇数,0≤f≤e)
∴ F2(999) = F2(999,499)*F2(499,249)*F2(249,125)*F2(125,61)*F2(61,31)*F2(31),
F2(499) = ____________F2(499,249)*F2(249,125)*F2(125,61)*F2(61,31)*F2(31),
F2(249) = ________________________F2(249,125)*F2(125,61)*F2(61,31)*F2(31),
F2(125) = ____________________________________F2(125,61)*F2(61,31)*F2(31),
F2( 61) = _______________________________________________F2(61,31)*F2(31),
F2( 31) = _________________________________________________________F2(31),
∴ F1(1000) = Pow2(983) * F2(999,499)
* [F2(499,249)^2] * [F2(249,125)^3]
* [F2(61,31)^4] * [F2(31)^5]
这样,我们又将阶乘转化为了乘方运算。
上式实际上是个形如 a * b^2 * c^3 * d^4 * e^5 的式子;我们再将指数转化为二进制,可得到如下公式:
a * b^2 * c^3 * d^4 * e^5 = (a*c*e)*[(b*c)^2]*[(d*e)^4]
= (((e*d)^2)*(c*b))^2*(e*c*a),
即可转化成了可充分利用高效的平方算法。
最后,我再提供大家一个确保“小整数累乘不溢出”的技巧,这是我自创的,相信会对大家有借鉴作用:
应采用“倒序”,比方说,应按 999 * 997 * ... 的顺序;
可预先设定一个数组,记录如果当前起始数组的最大值不大于某个值,则连乘多少个数不会溢出;
可利用“几何平均值≤算术平均值”定理,可推导出“ k 个自然数连乘不大于某个定值,其充分条件是其和不大于某个临界值”,我们只需要事先计算出它们的对应关系并保存下来。
kingyan1985
2007-05-18
打赏
举报
回复
2^(n+1)-2不对?
偶数学真的很差啊~
leixueqiyi
2007-05-18
打赏
举报
回复
jf
fchs520
2007-05-18
打赏
举报
回复
接个分
oliverkahn
2007-05-18
打赏
举报
回复
接分~
sunxw18
2007-05-18
打赏
举报
回复
2^(n+1)-2
一个首项为2,公比为2的等比数列!
daixinhou
2007-05-18
打赏
举报
回复
只求1分
zmacro
2007-05-18
打赏
举报
回复
mark
Red_angelX
2007-05-18
打赏
举报
回复
接个分
liubin911
2007-05-18
打赏
举报
回复
2^(n+1) - 2
antoniusguo
2007-05-18
打赏
举报
回复
看错,原来是^
antoniusguo
2007-05-18
打赏
举报
回复
(1 + n) * n
kimmking
2007-05-18
打赏
举报
回复
lz jt
jeapg
2007-05-17
打赏
举报
回复
这里高手还是很多哦
amandag
2007-05-17
打赏
举报
回复
唉,发现自己的数学基本没剩的了
khler
2007-05-17
打赏
举报
回复
我做的程序可以计算1~31间的数了,欢迎大家出数,我给答案
:)
juncochen
2007-05-17
打赏
举报
回复
我学了两个月,大家包容包容
static public int Code(int n)
{
int Mul = 2;
while (n != 1)
{
Mul *= 2;
n--;
}
return Mul;
}
static public int Sum(int n)
{
int Add = 0;
for (int i = n; i >= 1; i--)
{
Add += Code(i);
}
return Add;
}
加载更多回复(34)
编程可以这样学
《编程可以这样学》提出一种全新的学习理念,...算法在游戏开发中有什么用?学校开设的计算机相关课程在实际开发中如何联系在一起?五花八门的语言或技术都在怎样的情形下派上用场?遇到问题该去查阅哪一方面的书籍……
工作几年,回头看看,发现做的东西都没啥
技术含量
……
后来系统规模大了,发现读写分离,分库分表还是挺有
技术含量
的,折腾这些觉得自己进步了;然后做了guzz;现在发现团队里面是个人都把表分的散散的,好像只给他一台数据库都不知道怎么干活了。 ...
关于现在,关于测试……
没啥
技术含量
,用不到啥测试工具,主要锻炼的是业务理解能力和基础能力,而且还不是常规的那些业务。这段时间静下来思考了下自己的现状以及接下来的道路:换行业是不准备换的,我觉得测试行业挺好的,只是能赚到多少...
来,看看记事本里会变成乱码的字……不仅仅是“联通”而已……
众所周知,“联通“这两个字直接默认保存到记事本里会出现乱码,变成小黑块……具体原因网上解释很多,总结起来就一句话: “联通”的内码是0xC1(1100 0001), 0xAA(1010 1010),0xCD(1100 1101),0xA8(1010 1000)这...
一文详解深度学习冷板式液冷散热技术规范及要求
《绿色数据中心创新实践——冷板液冷系统设计参考》是在生态伙伴积极参与和大力支持下,应对 IT 设备功耗和功率密度的增加,需要新的冷却技术来满足不断提高的计算性能需求,而共同探索和提出的更经济、更高效的冷却...
C#
110,536
社区成员
642,578
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章