Back to Code Snippets / Powrót do Strzępów Kodu


#include<stdio.h>


/* UWAGI OPTYMALIZACYJNE:
* 1) dobrze jest pamietac ilosc cyfr, wtedy majac w tablicy
*    zapisana np liczbe 100 (czyli 0,0,1,0,0,0,0,...) nie bedzie
*    wykonywane mnozenie przez caaaaaala tablice
* 2) wyrownywania nie trzeba robic co kazda ture, mozna np co 3, 5
*    ale nie mozna dopuscic zeby ilosc cyfr w jednej komoorce
*    przekroczyla max zakres danego typu (np 10 dla unsigned int)
*    5 jest bezpieczne dla silnii pozniej 100!
*    3 jest bezpieczne dla silnii ponizej 1000!
*    2 jest bezpieczne dla silnii ponizej 100000!
*    potem zostaje 1
*/
void
silnia( int n )
{
 unsigned int cyfry[ 10000 ], j;
 int i;
 int liczba_cyfr; /* OPTYMALIZACJA 1) */
 int modulo; /* OPTYMALIZACJA 2) */

 /* OPTYMALIZACJA 2)
  * sprawdzamy przedzial
  */
 if( n >= 100000 ) modulo = 1;
 else if ( n >= 1000 ) modulo = 2;
 else if ( n >= 100 ) modulo = 3;
 else
   modulo = 5;

 /* najpierw zerujemy cyfry
  * (tablice/zmienne lokalne nie sa wyzerowane
  *  zawieraja smieci)
  */
 for( i = 1; i < 10000; i++ ) /* OPTYMALIZACJA 1) */
   cyfry[ i ] = 0;
 
 /* pierwsza cyfra to 1 */
 cyfry[ 0 ] = 1;
 liczba_cyfr = 1; /* OPTYMALIZACJA 1) */
 
 /* petla wyliczajaca mnozniki..
  * 2 * 3 * 4 * 5 * 6 * ...
  */
 for( j = 2; j <= n; j++ )
 {
   /* najpierw mnozymy wszystkie cyfry z 'j' */
   for( i = 0; i < liczba_cyfr; i++ )
     cyfry[ i ] *= j;

   /* czy poprawiamy wtej kolejce ? */
   if( j % modulo == 0 ) /* OPTYMALIZACJA 2) */
   {
     /* teraz poprawiamy */
     for( i = 0; i < liczba_cyfr || cyfry[ i ] > 0; i++ ) /* OPTYMALIZACJA 1) */
     {
       cyfry[ i + 1 ] += cyfry[ i ] / 10; /* nadwyzka do nastepnego */
       cyfry[ i ] %= 10; /* a tu obcinamy do jednej cyfry */
     }
     liczba_cyfr = i; /* OPTYMALIZACJA 1) */    
   }
 }

 /* na koncu tez poprawiamy */
 for( i = 0; i < liczba_cyfr || cyfry[ i ] > 0; i++ ) /* OPTYMALIZACJA 1) */
 {
   cyfry[ i + 1 ] += cyfry[ i ] / 10; /* nadwyzka do nastepnego */
   cyfry[ i ] %= 10; /* a tu obcinamy do jednej cyfry */
 }
 liczba_cyfr = i; /* OPTYMALIZACJA 1) */      

 /* teraz wypisujemy */
for( i = liczba_cyfr - 1; i >= 0; i-- ) /* OPTYMALIZACJA 1) */
  putchar( '0' + cyfry[ i ] ); /* wypisujemy cyferki */
}

int
main( void )
{
 silnia( 100 );

 return 0;
}

Add a comment:

Nick:
URL (optional):
Math captcha: 3 ∗ 6 + 6 =