大数字的计算能力
Calculating powers of big numbers
我正在用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,即(24)16=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
保存逗号向右移动的次数。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 如何知道我的Nvidia卡在C/C++中的计算能力
- 是通过计算能力1.x的设备中的缓存的全局内存负载/商店
- CUDA:达到 blockIdx.x 的最大可能值,用于计算能力 3.0
- 大数字的计算能力
- CUDA计算能力向后兼容性
- 有没有快速的算法计算能力乘以1 / 2
- CUDA:将全局内存写入和读取与计算能力同步 1.1