在没有pow()的情况下通过C程序查找整数m的n次幂

时间:2017-07-20 10:04:18

标签: c floating-point integer signed

C程序在没有pow()的情况下找到整数m的n次幂。

输入:

m=3 n=2
output:
9.000

验证程序的测试按预期工作!

  1. 负M
  2. Input : -2  3
    output : -8.000
    
    1. 负N
    2. Input : 2  -3  
      output : 0.125000
      
      1. 对于负M和N
      2. Input : -2  -3
        output : -0.125000
        

        但是我没有得到所需的输出

        void main() 
        {
        
            signed int m, n;
            int i;
            float p;
            clrscr();
            printf("Enter the number and its power (exponent)\n");
            scanf("%d%d",&m,&n);
            p=1;
            if (n==0)
            {
                printf("%d raised to %d is: %f",m,n,p);
            }
        
            if (n>0)
            {
                for( i = 0 ; i < n ; i++ )
                    p*=m;
                if(m>0)
                    printf("%d raised to %d is: %f",m,n,p); 
                if(m<0) 
                    printf("%d raised to %d is: %f",m,n,-p); 
            }
        
            if (n<0)
        
            {
                n=-n;
                for( i = 0 ; i < n ; i++ )
                    p*=m;
                if(m>0)
                    printf("%d raised to %d is: %f",m,-n,1/p);
                if(m<0)
                    printf("%d raised to %d is: %f",m,-n,-(1/p)); 
            }
            getch(); 
        }
        

        您可以为测试用例提供正确的程序吗?

        我无法声明signed float因为它发出错误。

3 个答案:

答案 0 :(得分:4)

否定代码不正确。当基础m为负数时,您不能盲目地否定结果。 ,但。此外,如果m为零,则不打印任何内容!

默认情况下会对int进行签名,因此signed int是噪音。 float也已签名;但是你可以使用double来获得更高的精度。 main的返回值应为int

因此,固定代码将是(根据您的喜好添加非标准clrscrgetch);

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int m, n, i;
    double p = 1.0;
    printf("Enter the number and its power (exponent)\n");
    scanf("%d%d",&m,&n);

    if (n==0) {
        printf("%d raised to %d is: %f",m,n,p);
    }

    else if (n > 0) {
        for(i = 0; i < n; i++)
            p*=m;
        printf("%d raised to %d is: %f",m,n,p); 
    }

    else { // n < 0
        n = -n;
        for (i = 0 ; i < n ; i++)
            p*=m;
        printf("%d raised to %d is: %f", m, -n, 1 / p);
    }
}

答案 1 :(得分:0)

尝试更改:

void main() 
{

    signed int m, n;
    int i;
    float p;
    printf("Enter the number and its power (exponent)\n");
    scanf("%d%d",&m,&n);
    p=1;
    if (n==0)
    {
        printf("%d raised to %d is: %f",m,n,p);
    }

    if (n>0)
    {
        for( i = 0 ; i < n ; i++ )
            p*=m;
        printf("%d raised to %d is: %f",m,n,p); 
    }

    if (n<0)

    {
        n=-n;
        for( i = 0 ; i < n ; i++ ){
            p*=m;
        }
         printf("%d raised to %d is: %f",m,-n,1/p);

    }

}

答案 2 :(得分:0)

@Antti Haapala很好地识别了OP代码中的错误。

作为与pow()替代相关的面试问题,当然采用log2 N步骤(如下所示)的解决方案优于采用N步(OP方法)的方法,其中N是指数。

关键是在每次迭代时对基础进行平方 使用log2 N步而不是N会导致最低有效数字中的错误减少。

使用负指数,简单地反转基数。

使用double提供至少10个,通常为17个十进制数字的精度。

double powdii(int x, int y) {
  double z = 1.0;
  double base = x;
  if (y < 0) {
    base = 1.0 / base;
  }
  while (y != 0.0) {
    if (y % 2) {
      z *= base;
    }
    y /= 2;
    base *= base;
  }
  return z;
}