silnia - problem z dużymi liczbami

0
#include <iostream> 
using namespace std; 

int silnia(unsigned long long n) 
{ 
    switch (n) 
    { 
           case 1: 
                return 1; 
                break; 
           default: 
                return n * silnia(n-1);
    } 
} 
int main() 
{ 
    unsigned long long l, lt, c=0; 
    cin>>lt;
    int *tab=new int[lt];
    for(int i=0; i<lt; i++)
    {
    cin >> l; 
    tab[c]=silnia(l);
    c++; 
    }
    for(int i=0; i<lt; i++)
            cout<< tab[i]/10 << " "<< tab[i]-((tab[i]/10)*10)<<endl;
            
    return 0;
}  

Problem w tym kiedy chcę wprowadzić liczbę 1 000 000 000 program się zawiesza...

0

Silnia z miliona miliarda (racja Somekind) :D

Wyliczyłem, że na końcu byłoby 249988 zer...
Żarty robisz ?

Jak już patrzę na kod, to pierwsze, co widzę, to:
Stack overflow

0

@ Gubbi mam propozycje.. udowodnij nam, że chodź troche masz pojęcie na temat tego co robisz i powiedz, albo napisz program który odpowie nam na pytanie, ile potrzeba by ramu do zadeklarowania takiej tablicy..

0

O, o ! Ja wiem !
Można by nawet na 4 mega ramu, z tym, że operowałoby się na plikach [green]

0

faktycznie dla dużo mniejszych liczb program nie działa tak jak powinien, hmm w czym problem?

0

Odpowiem CI na pytanie w "czym problem", jak obliczysz ile potrzeba by Ramu na zadeklarowanie tablicy int Tab[1000000000];

0

jeśli nie musisz najpierw wprowadzać całych danych, a później dopiero wyprowadzać wyniku, to spróbuj to tak napisać, żeby nie używało tablicy
i tak żeby wartość silni mieściła się w zmiennej;p w unsignet long największa liczba to 4 294 967 296

0

Już zrozumiałem.

Problem w czym innym...

#include <iostream> 
using namespace std; 

int silnia(int n) 
{ 
    switch (n) 
    { 
           case 1: 
                return 1; 
                break; 
           default: 
                return n * silnia(n-1);
    } 
} 
int main() 
{ 
    int l, c=0, lt, tab[c]; 
    cin>>lt;
    while(lt>c){
    cin >> l; 
    tab[c]=silnia(l);
    cout<< tab[c]/10 << " "<< tab[c]-((tab[c]/10)*10)<<endl;
    c++;
    }
    system("pause");
    return 0;
} 
 

...czas kompilacji, jak zejść poniżej 1 sek.

0

Znów zadanie na SPOJ? Jak widzę tak, weź sobie wypisz wartości silni od 1 do 12 i zobacz ich ostatnie 2 cyfry oraz zastanów się jak to będzie wyglądać dalej, a nie liczysz za każdym razem (LoL)

0

@gubbi no offence ale naucz się porządnie programować i MYŚLEĆ a nie kombinuj ze skracaniem czasu kompilacji i innymi cudami. Silnie liczyć rekurencyjnie? Chyba pomyliłeś języki. Rozumiem że pętla for() jest ci obca?
Poza tym warto mieć PODSTAWY matematyki (tak na podstawie 1-2 klasy podstawówki), żeby umieć wyliczyć że np. maksymalny zakres zmiennej w C++ (64 bitowej) starczy ci raptem na zapisanie wyniku dla 21 (albo 20, policz sobie) silnia.

0
#include <cstdio>
#include <cstdlib>

int main(int argc, char** argv) {

    int z;
    scanf("%d", &z);

    for (int i = 0; i < z; i++) {
        int n, r = 1;
        scanf("%d", &n);
        for (int i = 1; i <= n && r % 100 != 0; i++) {
            r *= i;
        }
        printf("%d\n", r % 100);
    }

    return EXIT_SUCCESS;
}

Liczenie dwóch ostatnich cyfr. O to chodziło?

0

zmodyfikowałem go do takiej postaci:

#include <iostream> 
using namespace std; 

int main() 
{ 
    long long l, c=0, lt, tab[c]; 
    cin>>lt;
    while(lt>c){
    cin >> l;
    tab[c]=l;
    for(int i=l-2; i>=1 ; i--)
              tab[c]+=tab[c]*i;
    cout<< tab[c]/10 << " "<< tab[c]-((tab[c]/10)*10)<<endl;
    c++;
    }
    return 0;
} 

Problem teraz w tym, że jak chcę wypisać liczby od 1 do 12, to przy wklepaniu 11 się zacina...

0

Ale po co tak kombinować?
Znów elementarna matematyka i trochę myślenia.
Począwszy od 5! ostatnia cyfra będzie zawsze 0
Począwszy od 10! dwie ostatnie cyfry zawsze będą zerami...

0

już wyczerpały mi się pomysły...

0
#include <iostream>
using namespace std;
int main()
{
    int t;
    cin >> t;
    int* N = new int[t];
    for(int a = 0; a != t; a++)cin >> N[a];
    for(int b= 0 ; b != t; b++)
    {
        switch(N[b])
        {
        case 0:
        case 1:
            cout << 0 << ' ' << 1 << endl;
            break;
        case 2:
            cout << 0 << ' ' << 2 << endl;
            break;
        case 3:
            cout << 0 << ' ' << 6 << endl;
            break;
        case 4:
            cout << 2 << ' ' << 4 << endl;
            break;
        case 8:
        case 6:
        case 5:
            cout << 2 << ' ' << 0 << endl;
            break;
        case 7:
            cout << 4 << ' ' << 0 << endl;
            break;
        case 9:
            cout << 8 << ' ' << 0 << endl;
            break;
        default:
            cout << 0 << ' ' << 0 << endl;
        }
    }
    return 0;
} 

Wyczerpała mi się cierpliwość...
Czas - 0.00

0

@Macron a powiesz mi po co w ogóle to gdzieś zapisujesz? Nie można po prostu wczytać liczby i puścić jej przez tego switcha? ;)

0

Dziękuję serdeczne, teraz już wiem o co kaman :) Mama mi zawsze powtarzała, że mam potencjał do komplikowania...

1 użytkowników online, w tym zalogowanych: 0, gości: 1