【发布时间】:2011-04-04 21:00:54
【问题描述】:
我正在尝试解决编程竞赛的初步问题,其中 2 个问题我必须计算并打印一些非常大的整数(如 100!、2^100)。
我还需要一种快速的方法来计算这个大整数的幂。
你能给我一些算法或数据结构的建议吗?(顺便说一句,我阅读了 C 接口和实现的“任意精度算术”部分,但它对 pow() 没有帮助)
编辑:我认为通过平方方法和位移的幂运算可以提高功率,但我还需要一种快速的方法来计算这个整数的阶乘。谢谢。
EDIT2:对于那些感兴趣的人;
找到包含长度为 N 的所有位串的最短位串长度(对不起我的英语,我会举个例子)。 N
例如,包含所有长度为 2(00, 01, 10, 11) 的位串的最短位串长度为 5(11001)。
我对这个问题的解决方案是 2^n + n - 1。(所以我应该计算 2 的幂,我想我会使用位移)
另一个问题是,给定 2 个长度,找出有多少种不同的方法可以达到长度 N。例如,输入是 10、2、3。那么你应该用 2 和 3 达到 10(例如, 2+2+2+2+2, 2+2+3+3, 3+2+2+3, 3+3+2+2...)。 1
我的解决方案是 2x + 3y = N,所以 x = (N - 3y) / 2 。对于从 0 到 2*N / 3 的 y,如果 x 是整数,那么我应该计算这个 X 和 Y 的广义排列,总计 += (x+y)! / (x!*y!)。
【问题讨论】:
-
什么是最大参数(100 个或更多?)以及计算答案需要多长时间?
-
问题不同,但我必须计算 2^10000 和 100!解决。时间限制为 1 秒,内存限制为 256mb。如果你有兴趣,我可以翻译这个问题。可能有另一种解决方案,但它写在问题文本中,答案大于 64 位。
-
约束非常小。因此,您可以通过平方进行求幂,如下所述,并找到阶乘,然后乘以 1、2、...、100。如果您以数字方式存储数字,那么您需要的只是将长数乘以 int和两个数字的乘法。您可以在我的答案中看到代码。
标签: c algorithm data-structures biginteger arbitrary-precision