Silnia SPOJ

0
#include <iostream>



using namespace std;

int silnia(int a)
{
	if ((a == 0) || (a == 1)) return 1;
	else return a * silnia(a - 1);

}


int main() {
	int a, jednosci, dziesiatek, iletestow;
	cin >> iletestow;
	for (int i = 0; i < iletestow; i++) {
		cin >> a;
		jednosci = silnia(a) % 10;
		dziesiatek = silnia(a) / 10;
		cout << jednosci << " " << dziesiatek << endl;
	}
}

Wrzucam coś takiego na SPOJ, ale odrzuca, że za długi czas.. jak to zoptymalizować?
tresc
https://pl.spoj.com/problems/FCTRL3/

1

To kolejne zadanko na myślenie 🙃

Policz sobie kolejne silnie - powiedzmy do 20! i zaobserwuj jakie wartości mają cyfry jednostek i dziesiątek.

0
#include <iostream>



using namespace std;

long double silnia(long double a)
{
	if ((a == 0) || (a == 1)) return 1;
	else return a * silnia(a - 1);

}


int main() {
	long double a, jednosci, dziesiatek, iletestow;
	cin >> iletestow;
	for (long double i = 0; i < iletestow; i++) {
		cin >> a;
		jednosci = (int)silnia(a) % 10;
		dziesiatek = silnia(a) / 10;
		cout << jednosci << " " << dziesiatek << endl;
	}
}

wymyslilem cos takiego, niestety nie chce sie kompilowac mimo ze nie ma bledow.

0

Przeanalizuj, co Ci napisał @kq nie możesz liczyć tej silni, żaden standardowy typ tego nie pociągnie, a na bigintach będzie za wolno. wydrukuj sobie kilkanaście pierwszych silni i obserwuj.

0

0! = 1

1! = 1

2! = 2

3! = 6

4! = 24

5! = 120

6! = 720

7! = 5040

8! = 40320

9! = 362880

10! = 3628800

11! = 39916800

12! = 479001600

13! = 6227020800

14! = 87178291200

15! = 1307674368000

16! = 20922789888000

17! = 355687428096000

18! = 6402373705728000

19! = 121645100408832000

20! = 2432902008176640000

szukam zaleznosci w ostatnich liczbach, ale niezbyt ja dostrzegam

0

Od 10! masz zawsze "00" na końcu.

0

aa czyli kazda silnia wieksza od 10, ma cyfre jednosci i dziesiatek 0-0

#include <iostream>

using namespace std;

long double silnia(long double a)
{
    if ((a == 0) || (a == 1)) return 1;
    else return a * silnia(a - 1);

}

int main() {
    long double a, jednosci, dziesiatek, iletestow;
    cin >> iletestow;
    for (long double i = 0; i < iletestow; i++) {
        cin >> a;
        if (a >= 10) {
            jednosci = (int)silnia(a) % 10;
            dziesiatek = silnia(a) / 10;
            cout << jednosci << " " << dziesiatek << endl;
        }
        else
            cout << "0 " << " 0";
    }
}

nie pokazuje mi zadnego bledu, a nie kompiluje ;/

0

Kompiluje się. Nie ma błędu kompilatora, ale jest kilka błędów logicznych.
Jeśli nie umiesz używać debugera, potestuj przy pomocy wyświetlania zmiennych przez cout.

0
#include <iostream>

using namespace std;

long double silnia(long double a)
{
    if ((a == 0) || (a == 1)) return 1;
    else return a * silnia(a - 1);

}

int main() {
    long double a, jednosci, dziesiatek, iletestow;
    int c;
    cin >> iletestow;
    for (int i = 0; i < iletestow; i++) {
        cin >> a;
        if (a < 10) {
            jednosci = ((int)silnia(a)) % 10;
            c = (int)silnia(a) / 10;
            dziesiatek = c % 10;
            cout << jednosci << " " << dziesiatek << endl;
        }
        else
            cout << "0 " << "0" << endl;
    }
}

niby kompiluje i wyswietla dobre wyniki, ale sedzia na spoju odrzuca.

0
#include <iostream>

using namespace std;

long double silnia(long double a)
{
    if ((a == 0) || (a == 1)) return 1;
    else return a * silnia(a - 1);

}

int main() {
    long double a, jednosci, dziesiatek, iletestow;
    int c;
    cin >> iletestow;
    for (int i = 0; i < iletestow; i++) {
        cin >> a;
        if (a < 10) {
            c = silnia(a);
            jednosci = c % 10;
            dziesiatek = (c/10) % 10;
            cout << dziesiatek << " " << jednosci << endl;
        }
        else
            cout << "0 " << "0" << endl;
    }
}

sluszna uwaga, do tego na SPOJ najpierw wyswietla sie liczba dziesiatek, nie jednosci

0

zeby nie tworzyc nowego tematu.
Robie zadanie z suma https://pl.spoj.com/problems/SUMA/

#include <iostream>



using namespace std;

int main() {

	int tab[300];
	int suma = 0;
	for (int i = 0; i < 300; i++) {

		cin >> tab[i];
		suma = suma + (tab[i]);
		cout << suma << endl;

		
	}

lecz nie wiem jak przerwac petle gdy wcisniety zostanie klawisz entera, bo chyba tak to trzeba zrobic?

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