Java:fatorial没有给出正确的结果,但我没有发现错误。

时间:2015-08-12 21:50:57

标签: java bluej

我在Java中开发了fatorial代码,在BlueJ的终端中编译和运行。我纠正了错误,但是fatorial并没有给出正确的结果。检查代码:

public class Fatorial
{
    public static void main (String [] args) 
    {
        int i, fat = 4;

        for (i=1;i<fat;i++)
        {
            fat=fat*i;
        }
        System.out.print(fat);
    }
}

正确的重播应该是fator(4) = 24

它应该类似于:

public class Fatorial3 { 
    public static void main(String[] args) { 
        int num, fatorial, aux; 

        num = 4; 
        aux = num; 

        fatorial = 1; 

        while(aux > 1){ 
            fatorial = fatorial * (aux);// Aqui não podemos subtrair 1, porque assim seria o fatorial de num-1 (4). 
            aux--; 
        } 
        System.out.println("O fatorial de "+num+" é: "+fatorial); 
    } 
}

但我想保留原始代码。

5 个答案:

答案 0 :(得分:2)

如果您展开循环结构,这就是您正在做的事情:

int i, fat = 4; // fat is 4 
i = 1;          // i is 1
fat = fat * i;  // fat = 4 * 1 = 4 
++i;            // i is 2
fat = fat * i;  // fat = 4 * 2 = 8
++i;            // i is 3
fat = fat * i;  // fat = 8 * 3 = 24
++i;            // i is 4, and that is less than 24, so keep going...

最终,fat溢出并变为负数,因此循环将终止,而fat将是一个较大的负数。

如果要保留类似的结构,请添加另一个变量来表示factorial运算符的参数:

int i, n = 4, fat = 1;
for (i=1;i<=n;i++)
{
  fat=fat*i;
}
System.out.print(fat);

答案 1 :(得分:0)

非递归解决方案是迭代而不是向上:

public static void main(String[] args) {
    System.out.print(factorial(4));
}

public static long factorial(long num) {
    for (long i = num-1; i > 0; i--)
    {
        num=num*i;
    }
    return num;
}

答案 2 :(得分:0)

你可以使用do ... while循环。 :)

public static int factorial(int number){
    int result= 1;
    int currentNumber = number;
    do{
    result = result * currentNumber;
    currentNumber--;
    }while (currentNumber > 1);

    return result;
}

然后你只需打印返回的结果......

System.out.println(factorial(4));

答案 3 :(得分:-1)

你的意思是阶乘?你可以这样做,使用递归会更容易

public class Factorial {
      public static void main(String[] args) {
           System.out.println(fact(4));
}

public static long fact (long n) {
    if (n <= 1)
        return 1;
    else 
        return n * fact (n-1);
}

}

顺便说一句,当您使用for循环时,您不必声明&#34; i&#34;在循环之外。声明在循环for (int i = 0; i < fat; i++)

答案 4 :(得分:-1)

当你宣布你的for循环时,你重新分配我是4。所述答案使用三个变量的原因是我们不会乘以0或任何负数。

对我来说,另一个建议是永远不要在同一行上声明多个变量:它使一些代码难以一目了然地阅读和理解。在这种情况下,i和fat都被分配4但这并不是很明显。

另一个问题是你正在检查胖,这会随着循环的每次执行而改变。你需要检查一个不会改变的数字,但脂肪确实存在。

尝试拆分您的变量声明并重新发布您打算工作的内容,这可能有助于我们引导您前往您想去的地方。