C 乘方求幂的实现

标签 c algorithm performance computation-theory

我试图在 C 中实现“平方取幂”算法,但我的程序有一个奇怪的行为。首先,这是一个小代码片段:

long long fast_power_1(long long base, long long power){
    long long result = 1;
    while (power > 0)
    {
        if (power % 2 == 0)
        {
            power = power / 2;
            base = base * base;
        }
        else
        {
            power = power - 1;
            result = (result*base);
            power = power / 2;
            base = (base * base);
        }
    }
return result;}

如果我调用函数:

printf("%d\n",fast_power_1(2,100));

我希望输出类似于 976371285,但结果是 0,我不太明白为什么。

最佳答案

long long 应该使用 %lld 格式说明符打印,否则它是未定义的行为。此外,对于较大的 power 值,此方法已经发生溢出 - 因为 long long 不能容纳 2^100(截至目前 3264 位系统-当它是128 位系统当然可以)。

到目前为止,在您的代码中,如果您提供的指数值不是太大并使用 printf("%lld",..) 那么它会给您一个有效的结果。

也许您想对其进行模块化运算。 (一般要求就此止步 - 比如对一些大质数进行模运算,即 10^9+7 )。

关于C 乘方求幂的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47820057/

相关文章:

c - 释放 C 中分配的内存

performance - 这个 Haskell 合并代码的运行时间是多少

performance - Elasticsearch .NET Nest API与HTTP RESTful API性能

c# - bool 检查比 null 检查快吗?

c++ - 如何加快我的稀疏矩阵求解器?

c - 如何在C中创建文件夹(需要在Linux和Windows上运行)

c - C 语言中的replaceString()函数

python - PyEval_InitThreads 什么时候被调用?

algorithm - 二进制搜索与一次固定一个数字

algorithm - `n` 分成三平方和的分区数(快速算法)