Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obliczanie sumy cyfr silni

Ostatnio zmodyfikowano 2017-07-01 01:20
Autor Wiadomość
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! :)
C/C++
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;
}
P-162961
mateczek
» 2017-06-30 20:54:35
jaki zakres liczb dla których chcesz wykonywać obliczenia ??
P-162962
Kinexity
» 2017-06-30 20:54:36
Źle obliczasz silnię na początku funkcji.

Prawidłowe obliczanie:
C/C++
int silnia = 1;
if( n > 0 ) {
    for( int i = n; i > 0; i-- ) {
        silnia *= i;
    }
}
P-162963
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.
C/C++
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;
}
P-162964
Kinexity
» 2017-06-30 22:03:46
Kompaktowa wersja funkcji:

C/C++
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):

C/C++
#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;
    }
}
}
P-162965
milmega
Temat założony przez niniejszego użytkownika
» 2017-06-30 23:45:00
Dziękuję bardzo :) Działa!
P-162967
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.
P-162968
« 1 »
  Strona 1 z 1