64 votes

Algorithmes factoriels dans différents langages

Je veux voir toutes les différentes façons que vous pouvez trouver, pour un sous-programme ou un programme de factorielle. L'espoir est que tout le monde puisse venir ici et voir s'il peut avoir envie d'apprendre un nouveau langage.

Des idées :

  • Procédure
  • Fonctionnel
  • Orienté objet
  • Commentaires
  • Obfuscated
  • Oddball
  • Mauvais code
  • Polyglotte

En fait, je veux voir un exemple de différentes façons d'écrire un algorithme, et de ce à quoi elles ressembleraient dans différents langages.

Veuillez vous limiter à un exemple par réponse. Je vous autoriserai à avoir plus d'un exemple par réponse, si vous essayez de mettre en valeur un style ou un langage spécifique, ou simplement une idée bien pensée qui se prête à un seul message.

La seule exigence réelle est qu'il doit trouver la factorielle d'un argument donné, dans toutes les langues représentées.

Soyez créatifs !

Ligne directrice recommandée :

\# Language Name: Optional Style type

   - Optional bullet points

    Code Goes Here

Other informational text goes here

De temps en temps, je modifierai les réponses qui ne sont pas correctement formatées.

184voto

A. Rex Points 17899

Polyglotte : 5 langues, toutes utilisant des bignums

J'ai donc écrit un polyglotte qui fonctionne dans les trois langues dans lesquelles j'écris souvent, ainsi qu'une autre langue de ma réponse à cette question et une autre que je viens d'apprendre aujourd'hui. C'est un programme autonome, qui lit une seule ligne contenant un entier non négatif et imprime une seule ligne contenant sa factorielle. Les bignums sont utilisés dans tous les langages, donc la factorielle maximale calculable ne dépend que des ressources de votre ordinateur.

  • Perl : utilise le paquetage intégré bignum. Exécuter avec perl FILENAME .
  • Haskell : utilise des bignums intégrés. Exécuter avec runhugs FILENAME ou l'équivalent de votre compilateur préféré.
  • C++ : nécessite GMP pour le support du bignum. Pour compiler avec g++, utilisez g++ -lgmpxx -lgmp -x c++ FILENAME pour faire le lien avec les bonnes bibliothèques. Après la compilation, exécutez ./a.out . Ou utilisez l'équivalent de votre compilateur préféré.
  • bourrage de crâne : J'ai écrit un support de bignum dans ce poste . Utilisation de La distribution classique de Muller , compiler avec bf < FILENAME > EXECUTABLE . Rendez la sortie exécutable et exécutez-la. Ou utilisez votre distribution préférée.
  • Espace blanc : utilise un support de bignum intégré. Exécuter avec wspace FILENAME .

Edit : a ajouté Whitespace comme cinquième langue. Au fait, est-ce que pas envelopper le code avec <code> car cela rompt les espaces blancs. De plus, le code est beaucoup plus joli en largeur fixe.

char //# b=0+0{- |0\*/; #>>>>,----------\[>>>>,--------
#define a/\*#--\]>>>>++<<<<<<<<\[>++++++\[<------>-\]<-<<<
#Perl   ><><><>  <> <> <<\]>>>>\[\[>>+<<-\]>>\[<<+>+>-\]<->
#C++    --><><> <><><>< > < > < +<\[>>>>+<<<-<\[-\]\]>\[-\]
#Haskell >>\]>\[-<<<<<\[<<<<\]>>>>\[\[>>+<<-\]>>\[<<+>+>-\]>>\]
#Whitespace >>>>\[-\[>+<-\]+>>>>\]<<<<\[<<<<\]<<<<\[<<<<
#brainf\*ck > < \]>>>>>\[>>>\[>>>>\]>>>>\[>>>>\]<<<<\[\[>>>>\*/
exp; ;//;#+<<<<-\]<<<<\]>>>>+<<<<<<<\[<<<<\]\[.POLYGLOT^5.
#include <gmpxx.h>//\]>>>>-\[>>>\[>>>>\]>>>>\[>>>>\]<<<<\[>>
#define eval int    main()//>+<<<-\]>>>\[<<<+>>+>->
#include <iostream>//<\]<-\[>>+<<\[-\]\]<<\[<<<<\]>>>>\[>\[>>>
#define print std::cout << // > <+<-\]>\[<<+>+>-\]<<\[>>>
#define z std::cin>>//<< +<<<-\]>>>\[<<<+>>+>-\]<->+++++
#define c/\*++++\[-<\[-\[>>>>+<<<<-\]\]>>>>\[<<<<+>>>>-\]<<\*/
#define abs int $n //>< <\]<\[>>+<<<<\[-\]>>\[<<+>>-\]\]>>\]<
#define uc mpz\_class fact(int  $n){/\*<<<\[<<<<\]<<<\[<<
use bignum;sub#<<\]>>>>-\]>>>>\]>>>\[>\[-\]>>>\]<<<<\[>>+<<-\]
z{$\_\[0+0\]=readline(\*STDIN);}sub fact{my($n)=shift;#>>
#\[<<+>+>-\]<->+<\[>-<\[-\]\]>\[-<<-<<<<\[>>+<<-\]>>\[<<+>+>+\*/
uc;if($n==0){return 1;}return $n\*fact($n-1);   }//;#
eval{abs;z($n);print fact($n);print("\\n")/\*2;};#-\]<->
'+<\[>-<\[-\]\]>\]<<\[<<<<\]<<<<-\[>>+<<-\]>>\[<<+>+>-\]+<\[>-+++
-}--    <\[-\]\]>\[-<<++++++++++<<<<-\[>>+<<-\]>>\[<<+>+>-++
fact 0  = 1 -- ><><><>< > <><>< \]+<\[>-<\[-\]\]>\]<<\[<<+ +
fact    n=n\*fact(n-1){-<<\]>>>>\[\[>>+<<-\]>>\[<<+>+++>+-}
main=do{n<-readLn;print(fact n)}-- +>-\]<->+<\[>>>>+<<+
{-x<-<\[-\]\]>\[-\]>>\]>\]>>>\[>>>>\]<<<<\[>+++++++\[<+++++++>-\]
<--.<<<<\]+written+by+++A+Rex+++2009+.';#+++x-}--x\*/;}

124voto

Ed. Points 1012

Lolcode :

Désolé, je n'ai pas pu résister xD

HAI
CAN HAS STDIO?
I HAS A VAR
I HAS A INT
I HAS A CHEEZBURGER
I HAS A FACTORIALNUM
IM IN YR LOOP
    UP VAR!!1
    TIEMZD INT!![CHEEZBURGER]
    UP FACTORIALNUM!!1
    IZ VAR BIGGER THAN FACTORIALNUM? GTFO
IM OUTTA YR LOOP
U SEEZ INT
KTHXBYE

52voto

Adam Davis Points 47683

Il s'agit de l'un des algorithmes les plus rapides, jusqu'à 170 ! . Il s'agit de échoue inexplicablement au-delà de 170 !, et il est relativement lent pour les petites factorielles, mais pour les factorielles comprises entre 1 000 et 2 000 euros. 80 et 170 il est incroyablement rapide par rapport à de nombreux algorithmes.

curl http://www.google.com/search?q=170!

Il existe également une interface en ligne, Essayez-le maintenant !

Faites-moi savoir si vous trouvez un bug, ou une implémentation plus rapide pour les grandes factorielles.


EDIT :

Cet algorithme est légèrement plus lent, mais donne des résultats supérieurs à 170 :

curl http://www58.wolframalpha.com/input/?i=171!

Il les simplifie également en diverses autres représentations.

48voto

cdv Points 10094

C++ : Métaprogrammation par modèles

Utilise le hack classique des enums.

template<unsigned int n>
struct factorial {
    enum { result = n * factorial<n - 1>::result };
};

template<>
struct factorial<0> {
    enum { result = 1 };
};

Utilisation.

const unsigned int x = factorial<4>::result;

Le factoriel est calculé complètement au moment de la compilation en fonction du paramètre n du modèle. Par conséquent, factorial<4>::result est une constante une fois que le compilateur a fait son travail.

34voto

Turambar Points 971

Espace blanc

    .
 .
    .
        .
    .
    .
             .
 .
         .
      .
    .
 .
  .
             .
                     .
 .
    .
.
     .
 .
.
    .
    .
.
.
.

Il a été difficile de l'afficher correctement, mais j'ai essayé de le copier à partir de l'aperçu et il fonctionne. Vous devez saisir le numéro et appuyer sur la touche Entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X