我有这个非常简单的函数来检查(N ^ N-1)^(N-2)的值:
int main() {
// Declare Variables
double n;
double answer;
// Function
cout << "Please enter a double number >= 3: ";
cin >> n;
answer = pow(n,(n-1)*(n-2));
cout << "n to the n-1) to the n-2 for doubles is " << answer << endl;
}
基于这个公式,很明显它会达到无穷大,但我很好奇,直到n的数量/值会达到无穷大?使用循环似乎效率极低,但这是我能想到的。基本上,创建一个循环,让n为1到100之间的数字,迭代直到n == inf
是否有更有效的方法解决这个问题?
答案 0 :(得分:1)
我认为你正以错误的方式接近这一点。 设:F(N)是函数(N ^(N-1))(N-2)
现在你真的知道什么是可以存储在double类型变量中的最大数字 是0x 7ff0 0000 0000 0000 Double Precision
所以现在你有F(N)= max_double 现在解决X问题。 这是否回答了你的问题?
答案 1 :(得分:0)
两件事:第一件事是(N ^(N-1))^(N-2))可写为N ^((N-1)*(N-2))。因此,这会删除一个pow
调用,使您的代码更快。
pow(n, (n-1)*(n-2));
第二个是要知道你遇到了什么实际限制,测试所有N只需要几分之一秒,所以没有理由找到另一种实用方法。
您可以手动计算可变大小限制和所有,但测试肯定更快。代码示例(C ++ 11,因为我使用std::isinf
):
#include <iostream>
#include <cmath>
#include <iomanip>
int main() {
double N = 1.0, diff = 10.0;
const unsigned digits = 10;
unsigned counter = digits;
while ( true ) {
double X = std::pow( N, (N-1.0) * (N-2.0) );
if ( std::isinf(X) ) {
--counter;
if ( !counter ) {
std::cout << std::setprecision(digits) << N << "\n";
break;
}
N -= diff;
diff /= 10;
}
N += diff;
}
return 0;
}
此示例在我的计算机上耗时不到一毫秒,并打印17.28894235