#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;
}
Back to Code Snippets / Powrót do Strzępów Kodu
Add a comment: