我需要在64位整数上运行。我试图将36的结果提升到12的力量作为练习(并作为一项要求)。
我在VS2008编译器上使用了无符号long long来表示64位整数。我已经制作了下面的代码,有人可以向我解释,为什么我的for循环版本会产生不正确的结果,而我的递归版Power函数会产生正确的结果?
仅供参考:36提高到12是4738381338321616896
template< typename _T1, typename _T2 >
_T1 Power( _T1 p_base, _T2 p_power )
{
/*
// This produces 0?!!
if( p_power == 0 ) return 1;
for( _T2 i = 1; i < p_power; ++i )
{
p_base *= p_base;
}
return p_base;
*/
// This produces correct result.
if( p_power == 0 ) return 1;
if( p_power == 1 ) return p_base;
return p_base * Power( p_base, p_power - 1 );
}
void main( int argc, char * argv[] )
{
unsigned long long charsetSize = 36LL;
printf( "Maximum Keys: %llu\n\n", Power( charsetSize, 12 ) );
system( "pause" );
}
答案 0 :(得分:5)
您在每次迭代时都会对结果进行平方。它应该是这样的:
_T1 result = 1;
for( _T2 i = 0; i < p_power; ++i )
{
result *= p_base;
}
请注意,如果您像这样编写循环,则不需要进行p_power == 0
检查。
答案 1 :(得分:1)
这是因为您将每个乘法的结果存储在p_base中。这可能导致变量溢出。
您需要分别存储p_base和“working”变量的输入值。通过for循环的逻辑,2到4的幂是65536。
答案 2 :(得分:1)
p_base *= p_base;
这是不正确的。结果在每次迭代后得到平方
校正
_T1 pow = 1LL;
for( _T2 i = 1; i <= p_power; ++i )
{
pow *= p_base;
}
return pow;