Błędy przy konwersji typów - double - int

0

Witam, robię zadania ze SPOJ'a i mam problem, przy konwersji typów z doubla na inta. Zadanie polega na wyświetleniu części dziesiętnej i części jedności z silnii podanej liczby.
Dla liczby 5 - silnia 120, części dziesiątych to 1 nie wiem właśnie dlaczego.
według mnie powinno tam być:
(120/100 - (int)(120/100) ) * 10 = (1.2 - 1) *10 = 2

	int ile;
	double po, pj, pd;
	double silnia = 1;
	long n;
	cin >> ile;
	for (int i = 0; i < ile; i++) {
		cin >> n;
		for (int j = 1; j < n+1; j++) {
			silnia = silnia*j; //silnia
		}
		pj =(((silnia / 10) - (int)(silnia / 10)) * 10);
		pd =(((silnia / 100) - (int)(silnia / 100)) * 10);
		cout << (int)(pd);
		silnia = 1;
	}
    return 0;
}

Pozdrawiam.

1

W zadaniach na SPOJu chodzi o to, aby ruszyć głową - pierwsze-lepsze rozwiązanie nie przejdzie.

Dam Ci podpowiedź: aby poznać ostatnie dwie cyfry silnii z liczby n wcale nie musisz wykonywać wszystkich mnożeń od 1 do n (bądź inaczej: musisz, ale nie "na pałę").

Zwłaszcza, że Twoje n przyjmuje wartości od 0 do 1 000 000 000 - zdajesz sobie sprawę, jak ogromną liczbą jest 1 000 000 000!? ;-) (wskazówka)

1

Zdajesz sobie sprawe, ze Nie Mozesz tej silni liczyc, naiwnie, do jakiegos proof of concept, bedzie:
s % 10
s / 100 % 10

1

wszystko powyżej 9 daje wynik zero, więc po co liczyć silnię? Wynik można bezczelnie umieścić w kodzie jako tablicę.

int main()
{
    int x, n;
    std::string tab[11] {
         "0 0\n",
         "0 1\n",
         "0 2\n",
         "0 6\n",
         "2 4\n",
         "2 0\n",
         "2 0\n",
         "4 0\n",
         "2 0\n",
         "8 0\n",
         "0 0\n",
    }

    // optymalizacja operacji wejścia wyjścia
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);

     cin >> n;
     for (int i=0; i < n; ++i) {
         cin >> x;
         cout << tab[std::min(10, x)];
     }
     cout << flush;
     return 0;
}

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