自定义 pow 函数对于 C 中的大指数返回 0

问题描述 投票:0回答:1

作为 C 初学者,我制作了自己的 pow 函数。 函数中的参数类型和返回值都是long long int。 这是代码:

typedef long long int lli;

lli p0wer(lli base, lli exp){
    lli p = 1;
    for(int i = 1; i <= exp; i++){
        p = p*base;  //we multiply exp times the base
    }
    return p;
}

问题是对于大指数,它返回0。 (对于较小的值,例如 10^10,它会正确返回结果) 我该如何解决这个问题?

c return-value zero pow
1个回答
0
投票

关于您的代码有两件事需要提及:

  1. 您正在将

    i
    (即
    int
    )与
    exp
    (即
    long long int
    )进行比较。就像@user30482提到的,如果指数大于2147483647(这是整数的最大值),你将有一个无限循环,因为这个整数将从1到(2**31 - 1),然后到又是1。

  2. 如果将结果打印为

    printf("%d\n", p0wer(2, 62));
    ,则最终结果总是 0,因为该值将大于整数。您应该有
    lld
    说明符,如 @pmg 提到的。

这是您的函数的有效代码:

#include <stdio.h>
typedef long long int lli;

lli p0wer(lli base, lli exp){
    lli p = 1;
    for(long long int i = 1; i <= exp; i++){
        p = p*base;  //we multiply exp times the base
    }
    return p;
}   

void main(void){
    printf("%lld\n", p0wer(2, 62));
    
}   

您可以测试比较

int
long long int
将如何导致无限循环:

#include <stdio.h>
typedef long long int lli;

lli p0wer(lli base, lli exp){
    lli p = 1;
    for(int i = 1; i <= exp; i*=2){
        p = p*base;  //we multiply exp times the base
    }   
    return p;
}   

void main(void){
    printf("%lld\n", p0wer(1, 99999999999));
    
}

这将永远运行。

© www.soinside.com 2019 - 2024. All rights reserved.