【发布时间】:2011-12-21 14:45:38
【问题描述】:
背景:
给定n 球,这样:
'a' balls are of colour GREEN
'b' balls are of colour BLUE
'c' balls are of colour RED
...
(当然是a + b + c + ... = n)
这些球可以排列的排列数由下式给出:
perm = n! / (a! b! c! ..)
问题 1:
我怎样才能“优雅地”计算perm 以避免整数溢出尽可能长,并确保当我完成计算时,我要么有正确的值perm ,或者我知道最终结果会溢出?
基本上,我想避免使用 GNU GMP 之类的东西。
(可选)问题 2: 这是一个真的坏主意,我应该继续使用 GMP 吗?
【问题讨论】:
-
为什么要避免 GMP?一般来说,您希望做的工作尽可能少。
-
检测溢出实际上是C语言的弱点之一。假设您设法尽可能长时间地避免溢出,因此可以确保您将获得正确的值,当且仅当可以计算它而不会溢出。即使这样,您仍然不会知道是否真的发生了溢出。
-
@Dave:你是对的。但是,这个问题很有趣。因此,对于那些关心“如何”而不是“为什么”的人来说,问题仍然存在:)。也许有人最终在交互式烤面包机的 8051 中使用它:P
标签: c overflow permutation integer-overflow