Silnia SPOJ

CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0
Kopiuj
#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/

edytowany 1x, ostatnio: crypton
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
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.


CR
wychodza liczby na minusie, wiec jak mniemam int nie obsluguje juz tak wysokich liczb
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0
Kopiuj
#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.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:2 minuty
  • Postów:4923
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.


CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
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

Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.99248296)
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

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

CR
no zgadza sie, mam odcinac zera? czy moze je zliczac?
MarekR22
czy ty zrozumiałeś treść zadania?
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0

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

Kopiuj
#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 ;/

edytowany 1x, ostatnio: crypton
vpiotr
Faktycznie, niezły wyczyn, dawno takiego cuda nie widziałem :)
vpiotr
nie pokazuje mi zadnego bledu, a nie kompiluje ;/
CR
ale wtopa.. mialem otwarta konsole na drugim moni xd
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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.

edytowany 1x, ostatnio: vpiotr
CR
ogarnalem, co do bledu, wlasnie go zauwazylem bo wypluwa zawsze 0 - 0
CR
if (a >= 10) jest zlym warunkiem, bo zawartosc tego if ma sie wykonywac gdy a<10 a nie gdy a>=10
vpiotr
tak
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0
Kopiuj
#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.

vpiotr
po co liczysz dwa razy silnie dla jednego przypadku?
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0
Kopiuj
#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

vpiotr
jeszcze zamień long double na unsigned i będzie nieźle.
CR
zrobione, dzieki!
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0

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

Kopiuj
#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?

lion137
Zdecydowanie, utwórz nowy temat.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.