【问题标题】:Finding nth power of integer m through C program without pow()通过没有 pow() 的 C 程序找到整数 m 的 n 次方
【发布时间】:2017-07-20 10:04:17
【问题描述】:

不使用 pow() 求整数 m 的 n 次方的 C 程序。

输入:

m=3 n=2
output:
9.000

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

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

能否为测试用例提供正确的程序?

我无法声明 signed float,因为它给出了错误。

【问题讨论】:

  • 对于某些指定的输入,预期输出和实际输出是多少?您是否尝试过在调试器中单步执行代码?
  • 是时候学习如何使用调试器了。
  • 您介意再次运行第 3 个案例吗?因为this 另有说明。

标签: c floating-point integer signed


【解决方案1】:

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

ints 是默认签名的,所以signed int 是噪音。 floats 也已签名;但在这里你也可以使用double 来获得更高的精度。 main的返回值应该是int

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

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

【讨论】:

  • 当他声称第三个测试用例验证通过时,我感到很惊讶。当我看到这个答案时,我在脑海中反复做数学:)
  • 谢谢 :)...为什么要使用双精度?正如你所说,它给出的精度是多少?
【解决方案2】:

尝试改变:

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

    }

}

【讨论】:

    【解决方案3】:

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


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

    关键是在每次迭代的基础上求平方。
    使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2021-06-09
      相关资源
      最近更新 更多