计算大数字的力量

时间:2012-01-08 12:32:03

标签: c++ long-integer

我正在用C ++编写一个程序,我必须计算n ^ n的值,其中1 <= n <= 10 ^ 9。但即使我使用long long类型来存储结果,答案也会计算到n = 15。 在n = 16时,出现浮点异常,并且在此之后结果显示负值。谁能告诉我代码有什么问题?

long long c;

c=(long long)n;
for(int i=2;i<=n;i++)
   c*=n;

 cout<<c<<endl;

5 个答案:

答案 0 :(得分:2)

如果你得到负值,那么你就会溢出变量。您需要使用范围较大的数据类型,足以容纳您希望计算的数字。如果你的系统没有这样的数据类型(我宁愿怀疑long long和你一样大),那么你需要使用一个bignum类。

仔细观察你问题中的数字,我认为许多标准的bignum类将无法计算n n n = 10 9 。你确定你正确地写下了这个问题吗?

答案 1 :(得分:1)

long long类型有64位并且已签名。这意味着您可以存储的最大数字是2 63 - 1.您尝试计算的数字是16 16 ,这是(2 4 16 = 2 64 因此不适合long long

尝试使用浮点类型double,但结果不准确。

答案 2 :(得分:1)

现在您已经给出了实际问题的链接(顺便说一下,给定的链接无法正常打开,因为它最后有一个']',所以对于任何感兴趣的人here都是一个工作链接)我可以提议解决方案。

您不需要计算数字本身所需要做的就是计算它的一些属性。对于最后的k个数字,你所要做的就是在除以10 ^ k时计算n ^ n的余数。这可以使用fast exponentiation在对数时间内完成。对于k小于10的前k个数字,我的方法将是以下 - 执行类似快速取幂的操作,但只关心每个中间结果的前m位数。我认为如果不尝试更高的m值,m = 100应该足以给你正确的答案。这种计算的复杂性是对数倍m。

希望这有帮助。

答案 3 :(得分:0)

你得到负值,因为16 ^ 16 = 2 ^ 64并且长long的范围高达2 ^ 63 - 1.所以你溢出long long类型。没有内置类型可以应对你想要做的那种计算甚至更多:对于10 ^ 9,n ^ n的值有9 * 10 ^ 9个数字并且几乎不适合常规的内存电脑。你究竟想做什么?

答案 4 :(得分:0)

对更高的数字进行对数计算。

log(n^n) = n * log(n)

如果在基数10中执行此操作,则可以在屏幕上以算法方式打印结果:

auto res = log10(n) * n;
auto integer_part = floor(res);
auto fractional_part = res - integer_part;

auto mantissa = pow(10, fractional_part);

现在mantissa保存结果的数字,integer_part表示您必须将逗号向右移动多少次。