此幂函数有什么问题?

时间:2018-09-21 16:08:11

标签: c function

我正在执行自己的幂函数(请参见下文)。它可以工作,但输入仅进入循环一次,因此如果在主目录中我有:x=power(10, 3);,则输出为100而不是1000。 你有什么主意吗? 预先谢谢你。

 int power(int a, int b) {
    int p=a;
    for (int i=1; i<=b; i++) {
        if ((b!=1) && (b!=0)) {
            a= p*a;
        }
        if ((b=1)) {
            a=a;
        }
        if ((b=0)) {
            a=1;
        }
    }
    return(a);
}

4 个答案:

答案 0 :(得分:1)

这是一个更简单的版本(为了更好地理解):

int power(int a, int b)
{
    int p=1;                   //CHANGE
    for (int i=0; i<b; i++)    //CHANGE
    {
       p= p*a;                 //CHANGE
    }

    return (p);                //CHANGE
}

在您的代码中,主要错误是初始化p=a,然后初始化a=p*a-即使通过b传递了 1 ,该值也会变成{{ 1}}(以100为基数。

答案 1 :(得分:0)

  1. 您正在使用语句bb=1设置b=0,而不是将b与1或0进行比较
  2. 您的for循环条件包括一个额外的迭代,导致错误的输出。您需要i < b而不是i <= b
  3. 您尝试在for循环中处理特殊情况,但可以在其外部轻松处理这些特殊情况(例如0次幂,1次幂,1次幂)

这是经过上述更正的代码

int power(int a, int b){

    /* 1 times 1 is always 1 */
    if(a == 1) return a;

    /* any number to the 0 power is always 1 */
    if(!b) return 1;

    /* any number to the 1 power is always itself */
    if(b == 1) return a;

    int p = a;

    for (int i = 1; i < b; i++){

        a = p*a;

    }

    return a;

}

我对此here进行了0到10的2次幂测试。

答案 2 :(得分:0)

  • 如果您不需要它与负值一起使用:请使用unsigned
  • 递归函数仅使用一项测试,它是尾递归,因此可以展开
  • 非递归版本还使用一个测试:循环条件
  • 注意:gcc -O2会为这两个函数生成完全相同的代码

unsigned power1(unsigned val, unsigned exp)
{
if (!exp) return 1;
return val * power1(val, exp-1);
}

unsigned power2(unsigned val, unsigned exp)
{
unsigned result = 1;

while (exp--) result *= val;

return result;
}

答案 3 :(得分:0)

输出为100,因为在第二和第三条if语句中,您分配给b变量新数字。

int power(int a, int b){
    int p=a;
    for (int i=1; i<b; ++i){
        if((b!=1) && (b!=0)){
            a= p*a;
        }
        if ((b==1)){
            a=a;
        }
        if ((b==0)){
            a=1;
        }    
    }
    return(a);
}