首页 > 解决方案 > 建立一个指数计算器

问题描述

我对 C# 编程比较陌生。我正在构建一个指数计算器,并且可以正常工作,但是在调试时遇到了一个问题,我不明白为什么会得到我得到的输出。

当我得到我知道是错误的输出时,这是有问题的类和方法。(注意我后来通过total *= lower在 for 循环中修复它)

using System;

namespace stars
{

  public class Exponent
  {

    public int Exp(int lower, int power)
    {
      int total = lower;
      if ( power == 0 )
      {
        //returns 1 for any exponent of 0
        Console.WriteLine(" 1");
        return 1;
      }
      else if ( lower == 0 )
      {
        //returns 0 for any base of 0
        Console.WriteLine("0");
        return 0;
      }
      else if ( ( power % 1 ) == 0 ) // check for integer exponent
      {
        for ( int i = 1; !( i > power ); i++ )  //math
        {
          lower *= lower;
        }
        Console.WriteLine(lower);
        return total;
      }
      else
      {
        Console.WriteLine("error");
      }
    }

  }

}

在最后一个elseif,我有我的forloop,为了(错误地)计算某个整数的值到另一个整数的幂,我(错误地)执行计算lower = lower * lower,其中lower是基数。

即 5^4,, 5 = 较低, 4 = 功率

无论如何,当我以 5^4 运行它时,结果是 0。为什么它会变成 0?我想它会像这样工作

5 * 5 = 25 ---> 25 * 25 = 625 ----> 625 * 625... 等等

或者最终值太大以至于编译器吐出 0。

标签: c#for-loopif-statementmath

解决方案


首先,您应该在您的例程中进行修改,并且 不要修改更改给定参数通常会导致错误。total lower

像这样的东西:

public class Exponent 
{
    // static: we don't want this
    public static int Exp(int lower, int power)
    {
        // Special cases  
        if (power == 0 || lower == 1)
            return 1;
        else if (lower == 0)
            return 0;
        else if (power < 0) //DONE: you've forgot about this case
            throw new ArgumentOutOfRangeException(nameof(power));  

        // we don't want "power % 1 == 0" case - int power is always integer

        // General case: math 
        int total = lower;

        // "!( i > power )" - let's put at simpler (and correct) - "i < power" 
        for (int i = 1; i < power; ++i)      
            total *= lower; 

        return total;  
    }
}

...

// 5**4 == 625
Console.Write(Exponent.Exp(5, 4));

推荐阅读