Zadania z potęgowania na SPOJ - błąd wykonania

0

Witam, od niedawna zacząłem przygodę z programowaniem (język c#) i znalazłem ciekawe zadania do wykonania ze strony SPOJa Niestety mam problem z jednym polegającym na tym, że podajemy dwie liczby np: a,b. Następnie mam wypisać na standardowe wyjście cyfrę jedności działania a do potęgi b. Mam taki kod (niby działa, ale strona go nie akceptuje - błąd wykonania):

using System;
namespace spoj3
{
    
    class Program
    {
        public static int wynik(int i, int i2, string dane)
        {
            try
            {
                return Convert.ToInt32(Math.Pow(Convert.ToDouble(new string(dane[i], 1)), Convert.ToDouble(new string(dane[i + 2], 1)))) % 10;
            }
            catch
            {
                return 0;
            }
        }
        static void Main(string[] args)
        {
            string linia=null;
            int n = 0;
            n = Convert.ToInt32(Console.ReadLine());
            for(int i = 0; i < n;++i)
                linia += Console.ReadLine();
            
            for (int i = 0; i < linia.Length - 1;)
            {
                Console.WriteLine(wynik(i, i + 2, linia));
                i += 3;
            }
        }
    }
}

Czy mógłby ktoś pomóc i wskazać mi kierunek gdzie szukać błędu?

0

Dlaczego wczytujesz całe dane wejściowe do linia?

0

zasugerowałem się tym, że na stronie jest pokazany przykład jak to ma wyglądać i uznałem, że trzeba najpierw podać wszystkie dane wejściowe a następnie wyniki. Teraz już wiem, że to błędne myślenie.

0

ok założyłem konto więc ponawiam. Napisałem to teraz inaczej i też niby działa, ale nadal mam błędną odpowiedź

using System;
namespace spoj3
{
    
    class Program
    {
        public static void wynik(string linia)
        {
            Console.WriteLine(Convert.ToInt32(Math.Pow(Convert.ToDouble(new string(linia[0], 1)), Convert.ToDouble(new string(linia[2], 1)))) % 10);
        }
        static void Main(string[] args)
        {
            string linia = null;
            int n = 0;
            n = Convert.ToInt32(Console.ReadLine());
            for (int i = 0; i < n; ++i)
            {
                linia = Console.ReadLine();
                wynik(linia);
            }
        }
    }
}
0

Powyższy problem rozwiązałem tak:

 
using System;
namespace spoj3
{
    
    class Program
    {
        static void Main(string[] args)
        {
            string linia = null;
            string[] liniaSeparator;
            int n = 0;
            n = Convert.ToInt32(Console.ReadLine());
            for (int i = 0; i < n; ++i)
            {
                linia = Console.ReadLine();
                liniaSeparator = linia.Split(' ');
                try
                {
                    Console.WriteLine(Convert.ToInt32(Math.Pow(Convert.ToDouble(liniaSeparator[0]), Convert.ToDouble(liniaSeparator[1])))%10);
                }
                catch
                {

                }
            }
        }
    }
}

Dodatkowo jeżeli nie używam try catch to po zakończeniu programu zostaje zwrócona wartość nie zerowa do system, przez co na SPOJu dostaję błąd: błąd wykonania (NZEC) Jak przechwytuję ten wyjątek to mam Błędną odpowiedź.

2

W zadaniach na SPOJu chodzi o to, aby być sprytnym - aby policzyć ostatnią cyfrę 3124543^123091239879 wcale nie musisz wykonywać całej tej potęgi.

0

Ok wiem o co Ci chodzi (chyba). Cyfry jedności się powtarzają przy tej samej podstawie potęgi, ale nie mogę ogarnąć jak to zaprogramować. Jedyne co mi przychodzi to nawalenie ifów i switchy, ale to bez sensu. Przynajmniej tak mi się wydaje. Dzięki wielkie za temat do przemyślenia. Potwierdź tylko czy w dobrą stronę poszedłem?

0

Raczej dobrze. Zauważ, że ostatnia cyfra potęgi jakiejś liczby jest równa ostatniej cyfrze potęgi ostatniej cyfry tej liczby, co Ci znacząco redukuje podstawę. Dalej, jako że masz tylko dziesięć podstaw (od zera do dziewiątki), to możesz sobie ręcznie wyznaczyć ich orbity i myśleć tylko o nich.

0

Stworzyłem coś takiego i nie rozumiem dlaczego tego nie łyka na spoju

using System;
namespace spoj3
{
    
    class Program
    {
        static void Main(string[] args)
        {
            string linia = null;
            string[] liniaSeparator;
            int n = 0,a=0,b = 0;
            n = Convert.ToInt32(Console.ReadLine());
            for (int i = 0; i < n; ++i)
            {
                linia = Console.ReadLine();
                liniaSeparator = linia.Split(' ');
                a = Convert.ToInt32(liniaSeparator[0]);
                b = Convert.ToInt32(liniaSeparator[1]);
                if (a % 10 == 1) Console.WriteLine("1");
                if (a % 10 == 5) Console.WriteLine("5");
                if (a % 10 == 6) Console.WriteLine("6");
                if (a % 10 == 2)
                {
                    if (b % 4 == 1) Console.WriteLine("2");
                    if (b % 4 == 2) Console.WriteLine("4");
                    if (b % 4 == 3) Console.WriteLine("8");
                    if (b % 4 == 0) Console.WriteLine("6");
                }
                if (a % 10 == 3)
                {
                    if (b % 4 == 1) Console.WriteLine("3");
                    if (b % 4 == 2) Console.WriteLine("9");
                    if (b % 4 == 3) Console.WriteLine("7");
                    if (b % 4 == 0) Console.WriteLine("1");
                }
                if (a % 10 == 4)
                {
                    if (b % 2 == 0) Console.WriteLine("6");
                    else Console.WriteLine("4");
                }
                if (a % 10 == 9)
                {
                    if (b % 2 == 0) Console.WriteLine("1");
                    else  Console.WriteLine("9");
                }
                if (a % 10 == 7)
                {
                    if (b % 4 == 1) Console.WriteLine("7");
                    if (b % 4 == 2) Console.WriteLine("9");
                    if (b % 4 == 3) Console.WriteLine("3");
                    if (b % 4 == 0) Console.WriteLine("1");
                }
                if (a % 10 == 8)
                {
                    if (b % 4 == 1) Console.WriteLine("8");
                    if (b % 4 == 2) Console.WriteLine("4");
                    if (b % 4 == 3) Console.WriteLine("2");
                    if (b % 4 == 0) Console.WriteLine("6");
                }
            }
            Console.ReadLine();
        }
    }
}
1

Dla a % 10 == 0 nic nie wypisuje. Popraw to i ci zaliczy.

0

Ok dzięki wielkie. Pytanie: mam problem z następnym zadaniem i mogę tutaj o nim pisać czy nowy wątek mam założyć?? Wybaczcie za głupie pytanie, ale nie wiem jak funkcjonują fora. To jest pierwsze forum na którym piszę

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