Problem z kompilacją zadania

Problem z kompilacją zadania
T2
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:2
0

Witam,
Mam problem z zadaniem ze strony polski spoj, chodzi o zadanie " PA05_POT - czy umiesz potęgować ? ". Chodzi w nim między innymi by na ekranie konsoli wyświetlić cyfrę jedności liczby zapisanej dziesiętnie oczywiście podniesionej do danej potęgi.
Przykładowo:

  • input: 2^3 , output: 8
  • input: 3^3 , output: 7

Oto kod działa poprawnie, lecz na stronie wyskakuje błąd wykonania. Niestety nie jest to pierwsze zadanie w którym mam podobny problem. Jest ktoś w stanie pomoc w czym leży błąd ?

Kopiuj
using System;

namespace PA05_POT___Czy_umiesz_potegowac
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = Convert.ToInt32(Console.ReadLine());
            int number_to_compound,compound,result;
            
            for(int i=0;i<n;i++)
            {
                number_to_compound = Convert.ToInt32(Console.ReadLine());
                compound = Convert.ToInt32(Console.ReadLine());              
            
                result = Compound(number_to_compound,compound);

                result = Record_number_unity(result);

                Console.WriteLine(result);
            }

        }
        static int Compound(int number_to_compound,int compound)
        {
            int result = 1;
            for(int i=0; i<compound; i++)
            {
                result *= number_to_compound;
            }
            return result;
        }
        static int Record_number_unity(int result)
        {
            result = result%10;

            return result;
        }
    }
}
edytowany 1x, ostatnio: Tobiasz2817
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
0

Treść błędu. Nie wróże z fusów...

T2
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:2
0

@AdamWox: A no tak wybacz, mój błąd bÅÄd wykonania (NZEC).

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
0

Po kolei:

  1. Nie Convert, tylko int.TryParse()
  2. Po co jest to pierwsze ReadLine() poza pętlą?
  3. NZEC oznacza Non Zero Exit Code - twój program się nigdy nie kończy przez to jak to jest zaprogramowane

Opakuj to w try oraz catch. Może dostajesz wyjątek, a spoj tylko tak błąd pokazuje. Każdy program musi zakończyć swoje działanie z kodem 0, twój na spoju tego nie robi.

edytowany 1x, ostatnio: AdamWox
T2
1. Dzięki, poprawie 2. Określa ilość prób. 3. Nie rozumiem zbytnio, jak to że nigdy się nie kończy ???
AdamWox
W jakich przypadkach dostajesz ten błąd? W jakim momencie?
T2
W momencie gdy na stronie polski spoj podaje kod do analizy by mi uznało zadanie. To wtedy właśnie taki błąd otrzymuje i zadanie zostaje odrzucone.
T2
Chyba już wiem w czym leży problem. "Opis każdego przypadku podany jest w jednym wierszu, zawierającym dwie liczby naturalne a i b oddzielone pojedynczym odstępem (spacją)" niestety lecz nie wiem jak to zrobić by wczytać wartości zostały oddzielone spacja i poprawnie wczytane do zmiennej.
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2161
1

Chyba nie powinienem ci wrzucać gotowca... Trudno, ja bym to zrobił tak:

Kopiuj
                string input = Console.ReadLine();

                if(input.Contains(" "))
                {
                    string[] values = input.Split(null);
                    string firstValue = values[0].Trim();
                    string secondValue = values[1].Trim();
                    int number_to_compound, compound, result;

                    if (int.TryParse(firstValue, out number_to_compound) && int.TryParse(secondValue, out compound))
                    {
                        result = Compound(number_to_compound, compound);
                        result = Record_number_unity(result);
                        Console.WriteLine(result);
                    }
                }

#edit
Oczywiście trochę pod siebie musisz dostosować ;-)

edytowany 1x, ostatnio: AdamWox
T2
Niestety niektórych funkcji jeszcze nie znam, lecz przeanalizuje je sobie i sprawdzę działanie. Dzięki wielkie , pozdrawiam :)
AdamWox
Właśnie dlatego nie powinieneś był dostał gotowca ale tak było szybciej dla mnie. Jak ci zależy to poświęcisz czas, poczytasz i będziesz wiedział co do czego. Good luck ;-)
ŁF
A co, jeśli input nie zawiera spacji? Powinien polecieć wyjątek, bo coś z danymi nie tak jest, a tu cisza. Po co null jako argument Split? Po co Trim, skoro Split usunie wszystkie spacje przy tworzeniu tablicy? Skąd wiesz, że będziesz mieć dwa wyniki (values.Count() > 1), skoro na inpucie może pojawić się sama spacja? Po co TryParse, skoro przy nieprawidłowych danych powinien polecieć wyjątek? To SPOJ, dane wejściowe będą poprawne, nie trzeba dodatkowych warunków. I wreszcie - zrobiłeś kosmetyczne zmiany, które w żaden sposób nie naprawiają istoty problemu.
AdamWox
Ja nigdy nie pisałem na spoj, nigdy z tego nie korzystałem. Próbuję rozwiązać problem jaki ma autor. Skąd mam wiedzieć, że dane wejściowe będą poprawne?
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
1
  1. To nie kompilacja, tylko wykonanie kodu - NZEC oznacza, że program zwrócił błąd, a zatem zaczął się wykonywać.
  2. Nie kompilujesz zadania, tylko kod programu, który wykonuje dane zadanie.
  3. Last, but not least:
Kopiuj
        static int Compound(int number_to_compound,int compound)
        {
            int result = 1;
            for(int i=0; i<compound; i++)
            {
                result *= number_to_compound;
            }
            return result;
        }

Uruchom to u siebie dla np. 2 i 32, albo jakiejkolwiek kombinacji liczby i potęgi wychodzącej poza zakres int.
Brute force wymaga potęgowania modulo 10.

Jednak optymalne rozwiązanie zadania nie wymaga żadnego potęgowania, wystarczy tylko znaleźć jedną dość prostą regułę. Zobacz, ostatnia cyfra bierze się z mnożenia poprzedniej cyfry, teraz popatrz na to, w jakie prawidłowości układają się ostatnie cyfry kolejnych potęg:

Kopiuj
0^n % 10 === 10^n % 10: 0, 0, 0, ...
1^n % 10 === 11^n % 10: 1, 1, 1, ...
2^n % 10: 2, 4, 8, 6, 2, 4, 8, 6...
3^n % 10: 3, 9, 7, 1, 3, 9, 7, 1, ...
4^n % 10: 4, 6, 4, 6, 4, 6, ...
5^n % 10: 5, 5, 5, 5, ...

analogiczne prawidłowości znajdziesz dla wszystkich liczb z przedziału 0-9. Wystarczy wrzucić to jako stałe do tablicy 2d, wiersz wybrać na podstawie ostatniej cyfry number_to_compound, kolumnę na podstawie compound % okres. Możesz spokojnie możesz założyć, że okres jest stały i wynosi 4. Całe działanie programu sprowadzi się do dwóch dzieleń modulo (przy czym drugie dzielenie możesz zastąpić wyczyszczeniem bitów od drugiego wzwyż, licząc od zera, bo tak działa dzielenie przez potęgi dwójki) i na podstawie wyniku wyciągnięcie odpowiednich danych z tablicy. Ewentualnie musisz jeszcze sprawdzić, czy potęga to 0 i zwrócić wtedy 1.Tadam!


edytowany 1x, ostatnio: ŁF
T2
Gdy sprawdzałem na stronie SPOJ co się dzieje jeśli wczytam wartości w ten sposób czyli wartość spacja wartość a nie uwzględnię tego w kodzie to SPOJ nie traktuje dwóch wartości jako wczytane lecz tylko tą jedną co jest z brzegu dlatego program jest ciągle uruchomiony i dlatego NZEC bo się po prostu nie kończy bo SPOJ nie próbuje wprowadzić więcej wartości. Chyba, że coś złe zrozumiałem. A to co kolega wyżej wrzucił działa poprawnie lecz pojawią się kolejny błąd "przekroczono limit czasu".

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.