Calculer la factorielle en java?
slt je suis debutant en java e
et je veux ecrir une classe en java qui permet calculer le factoriel d un entier . ce nombre est consideré comme !er argument de main(),il est entré par l utilisateur sur la ligne de commande , j ai essayé d ecrir 1 programme mais ca na pas marché .
voila le programme que je propose
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
public class Factoriel {
public static void main(String[] args) {
int i,a,b;
a=Integer.ParseInt(arg[0]);
b=a;
if (a!=0)
{for (i=1;1<b;i++)
a=a*i;
}
else
a=1;
System.out.println("le factde"+arg[0]+"est"+a);
}
} |
veuillez m'aidez s'il vous plait a trouver l'erreur
merci d'avance
il faut changer le type int par Le type long (8 octets) peut aller de −9×1018 à 9×1018 (encore plus gros…).
Citation:
Envoyé par
joel.drigo
yep :)
défi plus intéressant, en continuant à travailler avec le type int, comment faire pour calculer des factorielles avec un opérande plus grand que 12,
voilà mon essai :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
| public class Factorial {
private final static boolean OPTIMIZED=true;
private final static int MAX_ZEROS = Integer.MAX_VALUE-1;
private final int n;
private int zeros;
private int result;
private enum Status {
NEGATIVE_OPERAND(true),
OVERFLOW(true),
COMPUTED(false),
NOTCOMPUTED(false);
private final boolean error;
private Status(boolean error) {
this.error=error;
}
public final boolean isError() {
return error;
}
}
private Status status = Status.NOTCOMPUTED;
/**
*
*/
public Factorial(int n) {
this.n=n;
if ( this.n<0 ) {
status=Status.NEGATIVE_OPERAND;
}
}
public final int getOperand() {
return n;
}
public final int getResultWithoutTrailingZeros() {
assertNotError();
return result;
}
public final int getTrailingZeros() {
assertNotError();
return zeros;
}
public final int getMultiplier() {
assertNotError();
return 10^zeros;
}
private void assertNotError() {
_compute();
switch (status) {
case NEGATIVE_OPERAND:
throw new ArithmeticException("Negative operand: " + n);
case OVERFLOW:
throw new ArithmeticException("Int overflow error: " + n +"!");
}
}
public final void compute() {
_compute();
}
private void _compute() {
if ( status!=Status.NOTCOMPUTED ) return;
result=1;
zeros=0;
for(int i=1; i<=n; i++) {
int ii = i;
if ( !OPTIMIZED ) {
// pas de différence de résultat qu'on fasse ça ou pas
int tz = trailingZeros(ii);
while ( tz>0 && zeros<MAX_ZEROS ) {
ii/=10;
zeros++;
tz--;
}
}
if ( willOverflow(result,ii) ) {
status=Status.OVERFLOW;
break;
}
else {
result*=ii;
int tzr = trailingZeros(result);
while ( tzr>0 && zeros<MAX_ZEROS ) {
result/=10;
zeros++;
tzr--;
}
}
}
if ( status==null ) {
status=Status.COMPUTED;
}
}
private int trailingZeros(int n) {
if (n == 0) {
return -1;
}
int count = 0;
while (n % 10 == 0) {
count++;
n /= 10;
}
return count;
}
private boolean willOverflow(int a, int b) {
return a > (Integer.MAX_VALUE / b);
}
public final boolean isError() {
return getError().isError();
}
public final boolean isOverflow() {
return getError()==Status.OVERFLOW;
}
public final Status getError() {
_compute();
return status;
}
@Override
public String toString() {
_compute();
switch (status) {
case NEGATIVE_OPERAND:
return "Negative operand: " + n;
case OVERFLOW:
return "Int overflow error: " + n +"!";
}
char[] trailingZeros=new char[zeros];
Arrays.fill(trailingZeros, '0');
return result + new String(trailingZeros);
}
public static void main(String[] args) {
int n=0;
while(n<Integer.MAX_VALUE) {
Factorial f = new Factorial(n);
f.compute();
if ( f.isOverflow() ) {
break;
}
System.out.println(n + "! = " + f.toString() );
n++;
}
System.out.println("Cannot compute factorial for number greater or equals to " + n);
}
} |