J'ai essayé de trouver la factorielle d'un grand nombre par exemple. 8785856 d'une manière typique à l'aide de type pour boucle et double de données.
mais il affiche l'infini comme le résultat, peut être parce qu'il dépasse sa limite. P>
Alors s'il vous plaît guider donc-moi la voie à suivre la factorielle d'un très grand nombre. p>
mon code: p> sortie: - p> Je suis nouveau à Java mais j'ai appris des concepts de la manipulation IO et de tous. P> p>
12 Réponses :
Utilisez la classe BigInteger code>. (Je ne suis pas sûr que cela fonctionnera même pour de tels nombres entiers) p>
Ouais, j'ai aussi utilisé BigInteger aussi bien que le compilateur ne parvient pas à afficher la réponse pour un tel numéro, il y a donc une autre voie à suivre ???
@HIMANSHUAGGARWAL Vous pouvez essayer une chose méchante comme écrire votre propre routine de multiples pour les entiers. Par exemple, vous pouvez avoir deux gros entiers pour représenter un énorme entier. Eh bien, ce sera compliqué et encombrant. par exemple. Si mes entiers sont de taille 4 bits, pour représenter un nombre comme 18, je peux utiliser 2 entiers: 1 et 8 avec des pondérations appropriées. (1 avec pesée 10 ^ 1 et 8 avec 10 ^ 1). Donc, si vous pouvez écrire un code pour représenter de gros entiers dans des morceaux de petite taille avec des pondérations attachées et écrivez votre propre routine multiple, cela peut être fait.
Oui ... alors pouvez-vous m'expliquer cela dans un peu plus de détails.
C'était 10 ^ 0 pour 8, dans le commentaire précédent. Pour la multiplication, vous devez prendre soin de tous les pêpes et ainsi de suite. Ce sera lent. Très lent. Et le concept est basé sur wallacetree code>.
ok ..... mais cela va certainement être encombrant ..... au fait que Thanx pour cette explication ... Je vais essayer de mettre en œuvre cette méthode aussi ... :-)
Astuce: utilisez la classe code> BigInteger CODE> et être prêt à donner beaucoup de mémoire à la JVM. La valeur de 8785856! Code> est un très grand nombre. p>
Oui, j'ai également utilisé BigInteger aussi bien que le compilateur ne parvient pas à afficher la réponse pour un tel numéro, il y a d'autre manière ???
Essayez d'augmenter la taille du tas.
Si vous souhaitez que votre code fonctionne, utilisez la classe Infinity code>
est une valeur réservée spéciale dans le Double code>
Classe utilisée lorsque vous avez dépassé le nombre maximum que celui A double code> peut contenir. P>
BigDecimal code>, mais étant donné le numéro d'entrée, ne vous attendez pas à ce que votre programme ait terminé l'exécution à tout moment. P>
Oui, j'ai également utilisé BigInteger aussi bien que le compilateur ne parvient pas à afficher la réponse pour un tel numéro, il y a d'autre manière ???
Vous voudrez peut-être reconsidérer le calcul de cette énorme valeur. approximation de Wolfram Alpha suggère qu'il ne correspondra certainement pas à votre mémoire principale à afficher. P>
Sauf si je faisais le calcul, cela s'adapterait à la mémoire: log2 (10 ^ 10 ^ 8) = 3.32 * 10 ^ 8 = 300m bits = 38mbyle code>
Je dois dire que j'étais trop paresseux pour calculer moi-même l'utilisation de la mémoire. Par curiosité, est-ce que quelqu'un sache ce qui se passerait si vous essayez d'imprimer une pièce de mémoire de 38 Mo?
public static void main(String[] args) { BigInteger fact = BigInteger.valueOf(1); for (int i = 1; i <= 8785856; i++) fact = fact.multiply(BigInteger.valueOf(i)); System.out.println(fact); }
En fait, j'ai essayé celui-ci mais j'attends le compilateur pendant longtemps pour l'exécuter ......
Oui, tu dois. Et cela prendra également beaucoup de mémoire JVM mais nous n'avons pas d'autre choix que le nombre factoriel est trop gros !!
Mais j'ai attendu au moins 30-35 minutes ... mais rien ne s'est passé ... Devrais-je attendre pendant le temps la prochaine fois que je le courais ???
Vous pouvez augmenter votre mémoire JVM
Ce code doit fonctionner correctement: -
public class BigMath { public static String factorial(int n) { return factorial(n, 300); } private static String factorial(int n, int maxSize) { int res[] = new int[maxSize]; res[0] = 1; // Initialize result int res_size = 1; // Apply simple factorial formula n! = 1 * 2 * 3 * 4... * n for (int x = 2; x <= n; x++) { res_size = multiply(x, res, res_size); } StringBuffer buff = new StringBuffer(); for (int i = res_size - 1; i >= 0; i--) { buff.append(res[i]); } return buff.toString(); } /** * This function multiplies x with the number represented by res[]. res_size * is size of res[] or number of digits in the number represented by res[]. * This function uses simple school mathematics for multiplication. * * This function may value of res_size and returns the new value of res_size. */ private static int multiply(int x, int res[], int res_size) { int carry = 0; // Initialize carry. // One by one multiply n with individual digits of res[]. for (int i = 0; i < res_size; i++) { int prod = res[i] * x + carry; res[i] = prod % 10; // Store last digit of 'prod' in res[] carry = prod / 10; // Put rest in carry } // Put carry in res and increase result size. while (carry != 0) { res[res_size] = carry % 10; carry = carry / 10; res_size++; } return res_size; } /** Driver method. */ public static void main(String[] args) { int n = 100; System.out.printf("Factorial %d = %s%n", n, factorial(n)); } }
Cela est en fait un meilleur programme, efficace, aucune utilisation de BigInteger code>.
Pris de geeksforgeeks!
@Yudhishthirsingh Si vous trouvez le lien source, veuillez élever un drapeau personnalisé pour le plagiat. (Si c'est une copie exacte.)
Les solutions ci-dessus pour votre problème (8785856!) L'utilisation de BigInteger prendrait littéralement des heures de temps de la CPU si pas de jours. Avez-vous besoin du résultat exact ou si une approximation suffit-elle? P>
Il y a une approche mathématique appelée " approximation de Sterling
"Ce qui peut être calculé simplement et rapide, et ce qui suit est l'amélioration de GOSPER:
p>
import java.util.*; import java.math.*; class main { public static void main(String args[]) { Scanner sc= new Scanner(System.in); int i; int n=sc.nextInt(); BigInteger fact = BigInteger.valueOf(1); for ( i = 1; i <= n; i++) { fact = fact.multiply(BigInteger.valueOf(i)); } System.out.println(fact); } }
Je pense que la réponse serait meilleure sans la classe de scanner.
import java.util.Scanner; public class factorial { public static void main(String[] args) { System.out.println("Enter the number : "); Scanner s=new Scanner(System.in); int n=s.nextInt(); factorial f=new factorial(); int result=f.fact(n); System.out.println("factorial of "+n+" is "+result); } int fact(int a) { if(a==1) return 1; else return a*fact(a-1); } }
Essayez ceci:
import java.math.BigInteger; public class LargeFactorial { public static void main(String[] args) { int n = 50; } public static BigInteger factorial(int n) { BigInteger result = BigInteger.ONE; for (int i = 1; i <= n; i++) result = result.multiply(new BigInteger(i + "")); return result; } }
Désolé monsieur si ma réponse est fausse. J'ai essayé de répondre afin qu'il / elle puisse trouver factorial de n'importe quel nombre. Tout ce qu'il doit faire, c'est changer la valeur de n.
Scanner r = new Scanner(System.in); System.out.print("Input Number : "); int num = r.nextInt(); int ans = 1; if (num <= 0) { ans = 0; } while (num > 0) { System.out.println(num + " x "); ans *= num--; } System.out.println("\b\b=" + ans);
Modifier Votre réponse et ajouter une explication courte à votre code
public static void main (String[] args) throws java.lang.Exception { BigInteger fact= BigInteger.ONE; int factorialNo = 8785856 ; for (int i = 2; i <= factorialNo; i++) { fact = fact.multiply(new BigInteger(String.valueOf(i))); } System.out.println("Factorial of the given number is = " + fact); }
Pourquoi n'utilisez-vous pas de type de données plus élevé comme
biginteger code> et aussi ce devoir? Si oui, étiquetez comme telle.
vous boucle variable i est INT et vous essayez de stocker un nombre énorme dedans, essayez de le faire un double
Selon mes calculs, il faudra environ 25 mégaoctets de mémoire afin de représenter ce nombre. Et même alors, ce serait sans l'entourage de la classe code> BigInteger code>.
Ouais, j'ai aussi utilisé BigInteger aussi bien que le compilateur ne parvient pas à afficher la réponse pour un tel numéro, il y a donc une autre voie à suivre ???
Que voulez-vous dire, "omet d'afficher la réponse"? Pouvez-vous publier le code qui "Impossible d'afficher la réponse"?
Non, je voulais dire que pour un tel non. J'ai attendu au moins un HR ou donc ... mais rien ne s'est passé ..... Il affiche la réponse pour 10000 assez vite mais pas pour au-dessus de cette valeur ...... et aussi la réponse qu'il portait pour 11000 .t correspond à cette valeur ... wolframalpha.com/input/?i=11000!