2017-07-20 30 views
-4

找到没有pow的整数m的n次幂的C程序。通过没有pow的C程序找到整数m的n次幂()

输入:

m=3 n=2 
output: 
9.000 

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

  1. 对于负中号
Input : -2 3 
output : -8.000 
  • 对于负Ñ
  • Input : 2 -3 
    output : 0.125000 
    
  • 对于负M和N
  • 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(); 
    } 
    

    u能亲切地提供正确的测试用例程序?

    我不能声明signed float,因为它给出了一个错误。

    +3

    对于某些指定的输入,预期和实际输出是什么?你是否尝试过在调试器中的代码? –

    +2

    学习如何使用调试器的时间。 –

    +0

    你介意再次运行第三种情况吗?因为[this](https://ideone.com/hm0UDX)另有说明。 –

    回答

    4

    底片的代码是不正确。你不能盲目地否定结果当基地m是负面的。 ,但是。此外,如果m为零,则不会打印任何内容!

    int s是默认签名的,所以signed int是噪声。 float也被签名;但在这里你可以使用double更精确。 main的返回值应该是int

    因此固定的代码是(添加非标准clrscr S和getch s到你的口味):

    #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

    谢谢:))为什么使用双?你提到的精度是多少? –

    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); 
    
        } 
    
    } 
    
    0

    @Antti Haapala也确定了OP的代码中的错误。


    作为与pow()替代,当然一个解决方案,需要的log 2 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; 
    } 
    
    相关问题