Problem z kompilacją zadania

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 ?

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;
        }
    }
}
0

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

0

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

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.

1

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

                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ć ;-)

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:
        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:

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!

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