fakultet.c

Denna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.


/*
 * Beräknar fakulteten av argumentet med och utan rekursion.
 * Observera att rekursion av det här slaget fyller stacken ganska fort.
 * Kan räkna upp till 21! på 32-bitars arkitektur.
 */

#include<stdio.h>
#include<stdlib.h>

static unsigned long rek_fakultet(int n)
{
   if (n == 1)
      return 1;

   return rek_fakultet(n - 1) * n;
}

static unsigned long fakultet(int n)
{
   int x = 1;
   unsigned long sum = 1;
   while (x < n + 1)
      sum *= x++;
   return(sum);
}

/*
 * argc - Antalet argument
 * argv - En array av strängar innehållande argumenten.
 */
int main(int argc, char* argv[])
{
   int n;

   /* Programmets namn ligger i det första argumentet,
    * vi vill därför att det ska finnas två argument.
    */
   if (argc != 2)
   {
      printf("Usage: Fakultet Nummer\n");
      return EXIT_FAILURE;
   }

   /* Gör om strängen i det andra argumentet till ett tal */
   n = atoi(argv[1]);

   printf("%d! = %lu = %lu\n", n, rek_fakultet(n), fakultet(n));
   return EXIT_SUCCESS;
}