Silnia dużych liczb - brak wywołania funkcji

0

W końcu udało mi się to zaklepać (prawie), ale mam błędy - funkcja silnia() się nie wywołuje.

http://ideone.com/ppHoMy

Algorytm liczenia silni jest następujący:
W tablicy T trzymam sobie cyfry. Pięrwszą ustawiam jako 1, reszta to zera.
T={1, 0, 0, 0, 0...}
Następnie kazdą z cyfr w T mnoże w pętli przez kolejne naturalne liczby k>1

*2:
T={2, 0, 0, 0, 0...}
*3:
T={6, 0, 0, 0, 0...}
*4:
T={24, 0, 0, 0, 0...}

W każdym obiegu pętli (TODO - to mozna zoptymalizowac i robic to co kilka pętli) sprawdzam, czy jakas liczba przekroczyła 10 i "równam":
T={4, 2, 0, 0, 0...}

liczba_cyfr jest zmienną, ktora trzyma ile mamy cyfr stanowiących wynik w T
np dla
T={4, 2, 0, 0, 0...}
nie ma sensu mnożyć przez te zera, więc liczba_cyfr == 2 w tym wypadku.
Wynik odczytujemy od tyłu. Być może rozwiązanie jest banalne, ale siedze nad tą silnią drugi dzien i zaczynam już zastanawiać się nad elementarnymi komendami.

0

Przy każdej wielokrotności 5 pojawia Ci się 0 na końcu. Policz sobie teraz.

0

Jak to się nie wywołuje skoro masz jak byk napisane:

Błąd wykonania

Pamiętaj też, że wyjście jest buforowane i dopóki nie wrzucisz na wyjście znaku nowej linii to nic nie będzie wypisane. Po lekkiej zmiania, czyli dodaniu '<< endl' otrzymujemy coś takiego: http://ideone.com/J5MbFc

0
    for(i = 0; i<liczba_cyfr || T[i]>0; ++i)
    {
      T[i+1]+= T[i];
      T[i] = mod(T[i]);
    }

W tej pętli jest błąd.
Konkretnie w tym warunku:
T[i]>0

To jest potrzebne np przy takich danych:

T={2, 3, 415, 0, 0...}
liczba_cyfr == 3

Więc wykonałoby pętle 3 razy - ma wykonać 4, bo po wykonaniu trzecim:

T={2, 3, 4, 15, 0, 0...}
wtedy T[3]==15 > 0

EDIT: problem rozwiązany.

0

popatrz na tę pętlę która właśnie wypisałeś!

  • warunek jest bezsensu
  • a na dodatek wartość następnej komórki ustawiasz na obecną wartość, wiec efektywnie całą tablicę ustawiasz na tę samą liczbę z pierwszej komórki
    łącząc te dwa problemy masz nieskończoną pętlę i pisanie poza tablicą (błąd)!
0

Masz już wszystko rozłożone na tacy, wygląda na to że nie chcesz się nauczyć zaś chcesz gotowca:

#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
using namespace std;

const unsigned DIG=9;
const unsigned MOD=(unsigned)(exp(DIG*log(10))+0.5);

int main()
  {
   vector<unsigned> L(1,2);
   for(unsigned long long m=3;m<=3000000;++m)
     {
      unsigned long long p=0,next=0;
      for(unsigned i=0;i<L.size();L[i++]=p-MOD*(next=p/MOD),p=next) p+=m*L[i];
      if(p>0) L.push_back(p);
     }
   for(unsigned with=1,i=L.size()-1;i<L.size();--i,with=DIG) cout<<setfill('0')<<setw(with)<<L[i];
   return 0;
  }

Naprawdę napisałeś już na ten temat z 10 razy więcej tekstu w postach niż tego kodu który potrzebujesz.
Na dodatek niejako nas zmusiłeś do napisania 20 razy więcej tekstu w postach niż tego kodu który potrzebujesz.

0

Myslałem, ze nie trudno zauważyć
"EDIT: problem rozwiązany."
więc o żadnego gotowca nie prosiłem.
@MarekR22 nie osmieszaj sie z tymi warunkami. Błąd był tylko w podstawieniu, gdzie zapisałem [a+1]=[a], a powinno być [a+1]=[a]/10
@_13th_Dragon nie dość, że gotowca nie chciałem, to jeszcze napisałes takiego, ktorego można co najwyżej wywalić do kosza. Na kartce szybciej to licze.

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