1 / 9
Dec 2019

Witam, nie umiem znaleźć błędu do tego zadania Dwie cyfry silni(łatwe, 2 od góry). Stworzyłem 2 programy i żadnego mi nie akceptuje.

Niestety mam zabrane uprawnienia do linkowania.

1:
#include

using namespace std;

int main()
{

int n,a,b,D;

cin>>D;
for(int i=1; i<=D; i++)
{

cin>>n;

if(n==0)a=0, b=0;
if(n==1)a=0, b=1;
if(n==2)a=0, b=2;
if(n==3)a=0, b=6;
if(n==4)a=2, b=4;
if(n==5)a=2, b=0;
if(n==6)a=2, b=0;
if(n==7)a=4, b=0;
if(n==8)a=2, b=0;
if(n==9)a=8, b=0;
if(n>=10)a=0, b=0;

cout<<a<<" "<<b<<endl;
}
return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////

2

#include

using namespace std;

int main()
{

long long int a,wynik=1,c,d,D;

cin>>D; //////////Penta do tego ile licz chcemy sprawdzić
for(int i=1; i<=D; i++)
{

cin>>a; ////////Jaka liczba jest sprawdzana
if((a<10)&&(a!=0))///////////czy jest 0 lub wieksza od 10
{

for(int i=1; i<=a; i++) //////////////jestli jest z przedzialu"a" 1-9 to tego uzywa program
{
wynik*=i;

}
c=wynik; d=wynik;////////
c = c % 10; //to jest jedynka
d = d / 10; //to jest do dyszki
d = d % 10; //to jest dyszka

cout<<d<<" "<<c<<endl;////////////////Wiadomo co robi

wynik=1; //////////////////////potrzebuje tego by resetowac ustawienia
}

if((a>=10)||(a==0)) /////////// To jest cześć kodu omijająca pentle u góry pentle podajaca 0 0
{

d=0,c=0;
cout<<d<<" "<<c<<endl;
}
}
return 0;
}

  • created

    Dec '19
  • last reply

    Jan '20
  • 8

    replies

  • 1.1k

    views

  • 6

    users

  • 1

    like

  • 4

    links

Cześć. Po pierwsze staraj się unikać zwrotu “witam”. A jeśli chodzi o samo zadanie, może warto zastanowić się nad jakimś solidniejszym rozwiązaniem? Jeśli liczba jest większa niż 10, to tak jak zauważyłeś odpowiedź jest stała. Co do pozostałych przypadków można je rozwiązać brutalnie, czyli obliczyć n! i wziąć dwie ostatnie cyfry.

Pozdrawiam,
Michał

Twój pierwszy sposób jest poprawny i efektywny. Błąd jest banalny. Jest tak banalny, że Ci nie podpowiem na czym polega… :slight_smile: Przeanalizuj dokładnie swój kod.
A tak w ogóle to nie zaczynaj nowego wątku gdy jest inny wątek, w którym jest poruszany Twój problem.
jesli-zaczynasz-przeczytaj-koniecznie

Więc należy lepiej testować. Weź np pierwszy swój program i sprawdzaj swoje wyniki [lub każdy warunek if] np na/z:

  1. Średniej klasy kalkulatorem posiadającym funkcję n!
  2. kalkulatorem np z windows, przełaczonym do trybu naukowego
  3. wolframalpha --> https://www.wolframalpha.com/input/?i=10!2
  4. przeczytaj definicję silni w książce lub w necie
  5. przeczytaj treść zadania, i zwróć szczególną uwagę na trzecie zdanie

To nie oznacza, że jest drugie co do łatwości, chociaż jest w czołówce. Najłatwiejsze to zadania: próbne, samolot, proste dodawanie itd, --> inna kolejność zadań w kategorii łatwe: https://pl.spoj.com/problems/latwe/sort=6

Ale to nie znaczy, że nie można poprawnie wklejać swoich kodów do treści zadania.

Komentarze, są dobre, jeżeli są dobre, w przeciwnym wypadku tylko niepotrzebnie zaciemniają i zmniejszają czytelność kodu i utrudniają znajdowanie błędu/ów. Np:

cout<<d<<" "<<c<<endl;////////////////Wiadomo co robi

To po co to komentować?

cin>>a; ////////Jaka liczba jest sprawdzana

więc może lepiej zmienić nazwę zmiennej?, np:

cin >> sprawdzanaLiczba;

i dzięki takim zmianom/zabiegom pozbyć się niepotrzebnych komentarzy.

Lepiej, moim zdaniem, gdybyś dodał prawidłowych wcięć i białych znaków [formatowanie] niż dawać nadmiar zupełnie zbędnych komentarzy

Można liczyć tylko silnię [w ograniczonym zakresie, a rozbice na cyfrę dziesiątek i jedności wykonywać dopiero w momencie drukowania np:

cout << wynik % 100 / 10 << ' ' << wynik % 10 << '\n';

Działa to także gdy wynik = 0. Zlikwidowałbyś nadmiar zmiennych.

PS
No i obowiązuje konsekwencja, jeżeli lubisz zdrobnienia to np zamiast:

c = c % 10; //to jest jedynka

poprawnie[j]:

c %= 10; //to jest "jedyneczka", jak by ktoś nie wiedział o co chodzi to i tak nie będzie wiedział ;-)
21 days later
import math
x = []
y = int(input("Wprowadź liczbę przypadków: "))
while y != len(x):
    z = int(input("Wprowadź liczby do rozważenia: "))
    x.append(z)
w = []
for i in x:
    w.append(math.factorial(i))
for i in w:
    print(str(i/10).replace(".", " "))

Jeśli by ktoś mógł mi powiedzieć czemu to nie chce przejść ?

Moje przypuszczenie są następujące:

  1. Program liczy źle (nie tak jak powinien)
  2. Nie przeczytałeś DOKŁADNIE treści zadania
  3. Nie przemyślałeś możliwych problemów związanych z zadaniem.
  4. Nie przetestowałeś programu, nie sprawdziłeś czy wyniki są takie jak oczekiwane
    Wnioski:
    1. Testuj wyniki swojego programu w Ideone
    2. Naucz się poprawnie wklejać kod
    3.jesli zaczynasz przeczytaj koniecznie
    4. Rozwiazanie jest prostsze niż przypuszczasz
  1. czy napewno ta linijka wypisze tylko 2 cyfry silni:
  1. wystarczy przeliczyc pierwszych kilkanascie wartosci silni zeby cos zauwazyc.
t = 0
y = int(input("Wprowadź liczbę przypadków: "))
while t < y:
    x = int(input())
    if x == 1 or x == 0:
        print("0 1")
    elif x == 2:
        print("0 2")
    elif x == 3:
        print("0 6")
    elif x == 4:
        print("2 4")
    elif x == 5 or x == 6 or x == 8:
        print("2 0")
    elif x == 7:
        print("4 0")
    elif x == 9:
        print("8 0")
    elif x >= 10:
        print("0 0")
    t += 1

zrobiłem naprościej jak się da, ale dalej nie przyjmuje, co jest nie tak ?

A przeczytałeś: http://discuss.spoj.com/t/jesli-zaczynasz-przeczytaj-koniecznie/4 <— to jest link i trzeba w niego kliknąć. Dla ułatwienia, zwróć tam szczególną uwagę na ostatni akapit.

Widzę, że masz AC :wink: . Gratuluję!
Nie wiem, jak to ostatecznie rozwiązałeś, ale ostatni twój kod nie jest wcale najprostszy. Wysyłam Ci moją propozycję, twojego poprawionego na PM [prywatną pocztę].