Obliczanie sumy cyfr silni
Ostatnio zmodyfikowano 2017-07-01 01:20
milmega Temat założony przez niniejszego użytkownika |
Obliczanie sumy cyfr silni » 2017-06-30 20:04:53 Potrzebuję pomocy odnośnie napisania funkcji, która obliczałaby sumę cyfr silni. Do funkcji jest przekazywana konkretna liczba za pomocą parametru n. Narazie mam coś takiego, ale jest tu błąd, ale nie wiem gdzie. Z góry dziękuję za pomoc! :) unsigned int sumOfFactorialDigits( unsigned short n ) { int liczba; int suma = 0; int silnia = n *( n - 1 ); if( n == 0 ) { suma = 1; } if( n > 0 ) { while( silnia >= 1 ) { liczba = silnia % 10; if( liczba > 0 ) { suma += liczba; } silnia /= 10; } } return suma; }
|
|
mateczek |
» 2017-06-30 20:54:35 jaki zakres liczb dla których chcesz wykonywać obliczenia ?? |
|
Kinexity |
» 2017-06-30 20:54:36 Źle obliczasz silnię na początku funkcji. Prawidłowe obliczanie: int silnia = 1; if( n > 0 ) { for( int i = n; i > 0; i-- ) { silnia *= i; } }
|
|
milmega Temat założony przez niniejszego użytkownika |
» 2017-06-30 21:23:12 Poprawiłem na coś takiego, ale nadal funkcja działa tylko dla silni dla licz n < 13. unsigned int sumOfFactorialDigits( unsigned short n ) { int liczba; int suma = 0; int silnia = 1; if( n > 0 ) { for( int i = n; i > 0; i-- ) { silnia *= i; } } if( n == 0 ) { suma = 1; } if( n > 0 ) { while( silnia >= 1 ) { liczba = silnia % 10; if( liczba > 0 ) { suma += liczba; } silnia /= 10; } } return suma; }
|
|
Kinexity |
» 2017-06-30 22:03:46 Kompaktowa wersja funkcji: unsigned long long sumOfFactorialDigits( unsigned short n ) { unsigned long long suma = 0, silnia = 1; for( int i = n; i > 1; i-- ) { silnia *= i; } while( silnia >= 1 ) { suma += silnia % 10; silnia /= 10; } return suma; }
A propos tego co powiedziałeś, że powyżej n = 13 ci nie działa - silnia jest funkcją, której wartość rośniej tym szybciej im wyższe są argumenty. Nawet z powyższą funkcją maksymalna wartość n, dla której funkcja poda poprawną wartość to 21. EDIT: Dobra - wziąłem się i masz - przy pomocy matematyki z wyższych kręgów magicznych stworzyłem funkcję, która powinna Ci obliczyć sumę liczb silni dla BARDZO dużych n (uwaga, czas pracy rośnie w niekontrolowany sposób - dla n = 20000 zajęło to ok. 30 s na rdzeniu z taktowaniem 2,6 Ghz): #include "math.h" unsigned long long sumOfFactorialDigits( unsigned long long n ) { if( n >= 1 ) { unsigned long long suma = 0, * silnia, suma_log10_ui; long double suma_log10 = 0; for( unsigned long long i = 1; i <= n; i++ ) { suma_log10 += log10l( static_cast < long double >( i ) ); } suma_log10_ui = static_cast < unsigned long long >( ceil( suma_log10 ) ) + 1; silnia = new unsigned long long[ suma_log10_ui ]; silnia[ 0 ] = 1; for( unsigned int i = 1; i < suma_log10_ui; i++ ) { silnia[ i ] = 0; } for( unsigned long long i = 2; i <= n; i++ ) { for( unsigned long long j = 0; j < suma_log10_ui; j++ ) { silnia[ j ] *= i; } for( unsigned long long j = 0; j < suma_log10_ui; j++ ) { if( silnia[ j ] > 10 ) { silnia[ j + 1 ] += silnia[ j ] / 10; silnia[ j ] %= 10; } } } for( unsigned long long i = 0; i < suma_log10_ui; i++ ) { suma += silnia[ i ]; } return suma; } else { return 0; } } }
|
|
milmega Temat założony przez niniejszego użytkownika |
» 2017-06-30 23:45:00 Dziękuję bardzo :) Działa! |
|
Elaine |
» 2017-07-01 01:20:09 uwaga, czas pracy rośnie w niekontrolowany sposób - dla n = 20000 zajęło to ok. 30 s na rdzeniu z taktowaniem 2,6 Ghz |
Bo algorytm jest kiepski. Używając swinging factorial jestem w stanie policzyć na moim komputerze sumę cyfr silni z dziesięciu milionów w 30 sekund. |
|
« 1 » |