我知道2的幂可以使用<运算符。
10的力量怎么样?喜欢10 ^ 5?有什么方法比C(10,5)快吗?这是一个相当直接的计算。但是由于数字的二进制表示,计算机似乎不容易…让我们假设我只对整数幂感兴趣,10 ^ n,其中n是整数。
10的力量怎么样?喜欢10 ^ 5?有什么方法比C(10,5)快吗?这是一个相当直接的计算。但是由于数字的二进制表示,计算机似乎不容易…让我们假设我只对整数幂感兴趣,10 ^ n,其中n是整数。
这样的东西:
int quick_pow10(int n)
{
static int pow10[10] = {
1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000, 1000000000
};
return pow10[n];
}
很明显,可以做同样的事情很长一段时间。
这应该比任何竞争方法快几倍。但是,如果你有很多基础(尽管价值的数量大幅度下降,基数很大)是非常有限的,所以如果没有大量的组合,它仍然是可行的。
作为比较:
#include <iostream>
#include <cstdlib>
#include <cmath>
static int quick_pow10(int n)
{
static int pow10[10] = {
1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000, 1000000000
};
return pow10[n];
}
static int integer_pow(int x, int n)
{
int r = 1;
while (n--)
r *= x;
return r;
}
static int opt_int_pow(int n)
{
int r = 1;
const int x = 10;
while (n)
{
if (n & 1)
{
r *= x;
n--;
}
else
{
r *= x * x;
n -= 2;
}
}
return r;
}
int main(int argc, char **argv)
{
long long sum = 0;
int n = strtol(argv[1], 0, 0);
const long outer_loops = 1000000000;
if (argv[2][0] == 'a')
{
for(long i = 0; i < outer_loops / n; i++)
{
for(int j = 1; j < n+1; j++)
{
sum += quick_pow10(n);
}
}
}
if (argv[2][0] == 'b')
{
for(long i = 0; i < outer_loops / n; i++)
{
for(int j = 1; j < n+1; j++)
{
sum += integer_pow(10,n);
}
}
}
if (argv[2][0] == 'c')
{
for(long i = 0; i < outer_loops / n; i++)
{
for(int j = 1; j < n+1; j++)
{
sum += opt_int_pow(n);
}
}
}
std::cout << "sum=" << sum << std::endl;
return 0;
}
编译为g 4.6.3,使用-Wall -O2 -std = c 0x,给出以下结果:
$ g++ -Wall -O2 -std=c++0x pow.cpp
$ time ./a.out 8 a
sum=100000000000000000
real 0m0.124s
user 0m0.119s
sys 0m0.004s
$ time ./a.out 8 b
sum=100000000000000000
real 0m7.502s
user 0m7.482s
sys 0m0.003s
$ time ./a.out 8 c
sum=100000000000000000
real 0m6.098s
user 0m6.077s
sys 0m0.002s
(我也有一个使用pow的选项,但是当我第一次尝试它需要1m22.56s,所以当我决定优化循环变体时我删除它)
翻译自:https://stackoverflow.com/questions/18581560/any-way-faster-than-pow-to-compute-an-integer-power-of-10-in-c
转载注明原文:任何速度比pow()计算C中的整数幂为10的任何方式?