programas - factorial java math
Programa Java para salida factorial incorrecta (6)
Estoy ejecutando la siguiente pieza de código Java en Eclipse IDE.
public class Programs {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i, num, n;
n = 6;
// num=n-1;
for (i = 1; i <= n - 1; i++) {
n = n * i;
}
System.out.println("Factorial of the declared number is" + " " + n);
}
}
Muestra la salida como -1420957696. El código funciona bien si elimino el comentario y uso la variable "num" en el ciclo for. Creo que para cada iteración el valor de n
cambia gradualmente de forma increíble en comparación con el valor de i
. El mismo código funciona bien en VBScript (ver a continuación). ¿Alguien puede explicar la diferencia?
Option Explicit
Dim i, num
num = InputBox("enter a number")
For i=1 To num-1
num = num * i
Next
MsgBox "The factorial of entered number is: " & num, 3, "Program for factorial"
Como se menciona en las respuestas anteriores, la evaluación de la condición causa la excepción. Lo que puede hacer es mantener una variable separada para verificar la condición en el ciclo de esta manera.
int i,fact=1;
int number=5;//Number to calculate factorial
for(i=1;i<=number;i++){
fact=fact*i;
}
No está almacenando la multiplicación anterior en otra variable y su n
siempre está aumentando, por lo que la condición en i
cambia cada iteración.
En su lugar, puede tener una variable separada para mantener su factorial
.
class FactorialExample{
public static void main(String args[]){
int i,fact=1;
int number=5;//It is the number to calculate factorial
for(i=1;i<=number;i++){
fact=fact*i;
}
System.out.println("Factorial of "+number+" is: "+fact);
}
}
Espero que ayude.
cada iteración en el forloop i <= n-1 está marcada. Como n aumenta todo el tiempo, el ciclo for se ejecutará hasta que n alcance el número más alto posible de INTEGER y se vuelva negativo.
no está almacenando la multiplicación anterior en otra variable y su n siempre está aumentando, por lo que la condición en para para i cambia cada iteración.
se trata de cuándo se leen los números en comparación con cuándo se configuran:
n = 6;
for (i = 1; i <= n - 1; i++) {
n = n * i;
}
Lo que java hará es: Establecer i = 1
, hacer la comprobación i <= n-1
(1 <= 5) luego ejecutar el código entre llaves, luego incrementar i ( i++
). Luego, esto se repite: i ahora es igual a 2, la verificación i <= n-1
(2 <= 4) n ha cambiado en la última iteración, por lo que la verificación usará el nuevo valor. así que en la próxima iteración n = 12
.
Esto hace que n
crezca más rápido que i
modo que cuando se supera la capacidad de un número entero, haciendo que n
sea negativo, la condición de ciclo se resuelve en falso.
La respuesta es no modificar el valor en su condición de bucle dentro del bucle.
n = 6;
num = n - 1;
for (i = 1; i <= num; i++) {
n = n * i;
}
La forma en que el bucle trabaja para VB es calculando los números para el principio y el final del bucle cuando se inicia, lo que significa que num
solo se leyó una vez.
Java:
n
va a ser bastante grande cf. i
.
Por lo tanto, i <= n - 1
siempre será true
, hasta que tu n
desborde y se vuelva negativo.
Una solución sería usar num
para mantener el valor original de n
, y usar i <= num - 1
como condición de detención.
VBScript:
En los diversos conceptos básicos (por ejemplo, VBScript, VBA), num-1
se calcula de manera efectiva al inicio del ciclo, y el ajuste adicional a num
no tiene ningún efecto en la condición de detención. Puedes ver esto explícitamente ejecutando
Dim j
Dim i
j = 10
For i = 1 To j
WScript.Echo i
j = 1 ''has no effect on the stopping condition.
Next