大数字的计算能力

Calculating powers of big numbers

本文关键字:能力 计算 数字      更新时间:2023-10-16

我正在用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;

如果得到负值,则表示变量溢出。您需要使用范围更大的数据类型,该数据类型足以容纳要计算的数字。如果您的系统没有这样的数据类型(而且我怀疑long long和您将得到的一样大),那么您将需要使用bignum类。

仔细看你问题中的数字,我认为许多标准bignum类将无法计算n=109的nn。你确定你把问题写对了吗?

long long类型有64位,并且有符号。这意味着你可以存储的最大数字是263-1。您试图计算的数字是1616,即(2416=264并且因此不适合long long

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

既然你已经给出了一个实际问题的链接(顺便说一句,给出的链接没有正确打开,因为它最后有一个"]",所以对于任何感兴趣的人来说,这里是一个工作链接),我可以为它提出一个解决方案。

你不需要计算数字本身,你只需要计算它的一些性质。对于最后k个数字,你只需计算n^n除以10^k的余数。这可以使用对数时间内的快速求幂来完成。对于k小于10的前k位数字,我的方法如下——做一些类似于快速求幂的事情,但只关心每个中间结果的前m位数字。我认为,如果不用更高的m值进行实验,m=100应该足以给你正确的答案。这个计算的复杂性将是m的对数倍。

希望这能有所帮助。

您会得到负值,因为16^16=2^64,长-长的范围最大为2^63-1。所以您溢出了long-long类型。没有内置类型可以处理您想要进行的计算,甚至更多:对于10^9,n^n的值有9*10^9位数字,很难放入普通计算机的内存中。你到底想干什么?

对较大的数字进行对数计算。

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保存逗号向右移动的次数。