我在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);
}
}
但我想保留原始代码。
答案 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但这并不是很明显。
另一个问题是你正在检查胖,这会随着循环的每次执行而改变。你需要检查一个不会改变的数字,但脂肪确实存在。
尝试拆分您的变量声明并重新发布您打算工作的内容,这可能有助于我们引导您前往您想去的地方。