104 / 237
Nov 2016

Co jest złego z tym kodem? (Jeśli zamierzasz odpowiedzieć poczytaj u góry to oszczędź klawiatury i nie odpisuj ;] )

include

include

using namespace std;
unsigned long long a,b,temp,wynik,ile;
int main()
{
cin>>ile;
for(unsigned int i=1; i<=ile; i++)
{
cin>>a>>b;
temp=pow(a,b);
if(b==1)
{
wynik=a;
}
if (b==0)
{
wynik=1;
}
else{
wynik=temp%10;
}
cout<<wynik;
}
return 0;
}
`

nic nie jest złego - tyle, że poprawnie rozwiązuje tylko niewielki podzbiór możliwych zestawów danych

oczywiście informacja, dlaczego tak się dzieje jest gdzieś powyżej w tym wątku.

z twojego komentarza rozumiem, że nie masz czasu, aby przeczytać cały wątek (lub nie rozumiesz co czytasz)

ja natomiast nie mam czasu po raz n-ty tłumaczyć podstawowych rzeczy

pozdrawiam, i życzę powodzenia

16 days later

Na ideone nie testowałem, tylko na kompie. I na kompie wszystko jest okej. Te przykłady, których użyłeś działają u mnie poprawnie, a na ideone już nie. O co chodzi? :confused:

25 days later

Witam,

poczytałem wszystkie wątki i już mam pomysł na inne rozwiązanie z case'ami :wink: jednak zapisałem to inaczej link14 i zastanawiam się dlaczego mi nie przechodzi.
Wykonałem wszystkie testy jakie tu podajecie i zawsze miałem prawidłową odpowiedź a mimo to dostaję od sędziego błędną odpowiedź :confused:

Byłbym wdzięczny za wskazówkę co zrobiłem nie tak.

wszystkich zamieszczonych tu testów to nie zrobiłeś - sprawdź dla danych zamieszczonych w poście nr. 52

Możesz jaśniej? Bo nie rozumiem.
W 52 jest o if a==0 <- co z założenia jest niepotrzebne, bo liczby są z zakresu 1 <= a <= 1000000000 :wink: a w sytuacji a==1 to moje rozwiązanie też powinno zadziałać; niemniej jednak dodałem if'a dla a==1, ale sędzie i tak nie przepuszcza.

Nie rozumiem, z czym sędzia ma w tej sytuacji problem.

Proszę o wyjaśnienie, nie rozwiązanie, bo chcę zrozumieć co jest złego w moim kodzie. Koduję dopiero tydzień, więc proszę o wzięcie tego pod uwagę przy pisaniu :slight_smile:

Z góry dziękuję za pomoc.

być może źle liczyłem posty :), może to jest 53 - w każdym razie autorem jest j4rooo, podany jest tam test dla około 40 par liczb, dla części z nich masz złe wyniki

Witam, u mnie test z postu 53 daje tyle wyników ile trzeba, natomiast mam problem z innym testem wypisanym tutaj,
http://ideone.com/tnXXKq16

Czy moglibyście dać jakaś podpowiedź co jest źle bo już mam załamkę?

Zwiększ zmienne do long long int.

Po tej zmianie:

Twoj out:
1
1
2
1
4
5
6
7
2
0
0

Prawidłowy out:

1
1
2
1
4
5
6
7
2
9
0

Czyli nie przechodzi ci tego testu:
1
9 21538123

dane wejściowe są z poza zakresu podanego w zadaniu i z poza zakresu int-a
zaś w przypadku używania cin, jeżeli wczytywana liczba przekracza zakres typu, to skutkuje to zniszczeniem strumienia wejściowego

dla tego testu zamiast 2321323123 wczytywane jest 2147483647 (max dla int-a), a później wczytywane wartości to same 0

10 days later

Witam, kod wydaje mi się dobry ale nie chce przejść więc coś musi być nie tak... Proszę o pomoc z tym

include

include

using namespace std;

int main()
{
int n;
cin>>n;
unsigned long long int a,b;
for(int i=0; i<n; i++)
{cin>>a;
cin>>b;

switch (a%10)
{

    case 1: cout<<1<<endl; break;
    case 2:
        {   int tmp=b - 4*((b-1)/4);

            if(tmp==4 )
                cout<<6<<endl;
            else if (tmp==1)
                cout<<2<<endl;
            else if (tmp==2)
                cout<<4<<endl;
            else if (tmp==3)
                cout<<8<<endl;
                break;
        }
    case 3:            {   int tmp=b - 3*((b-1)/3);

            if(tmp==1 )
                cout<<3<<endl;
            else if (tmp==2)
                cout<<9<<endl;
            else if (tmp==3)
                cout<<7<<endl;
                break;
        }
    case 4:
        {   int tmp=b - 2*((b-1)/2);

            if(tmp==1 )
                cout<<4<<endl;
            else if (tmp==2)
                cout<<6<<endl;
                break;
        }
    case 5: cout<<5<<endl; break;
    case 6: cout<<6<<endl; break;
    case 7:
            {   int tmp=b - 4*((b-1)/4);

            if(tmp==1 )
                cout<<7<<endl;
            else if (tmp==2)
                cout<<9<<endl;
            else if (tmp==3)
                cout<<3<<endl;
            else if (tmp==4)
                cout<<1<<endl;
                break;
            }
    case 8:
        {   int tmp=b - 4*((b-1)/4);

            if(tmp==1 )
                cout<<8<<endl;
            else if (tmp==2)
                cout<<4<<endl;
            else if (tmp==3)
                cout<<2<<endl;
            else if (tmp==4)
                cout<<6<<endl;
                break;
        }

    case 9:
            {   int tmp=b - 2*((b-1)/2);

                    if(tmp==1 )
                        cout<<9<<endl;
                    else if (tmp==2)
                        cout<<1<<endl;
                    break;
            }
    case 0: cout<<0<<endl; break;

}

}

return 0;

}

21 days later

Czy ktoś ma pomysł jak mogę przyśpieszyć program? Sędzia wyrzuca mi przekroczenie limitu czasu...

int n, p, w;

long int potega(int p, int w)
{
if (w==0) return 1;
else return p*potega(p,w-1);
}

int main()
{
cin>>n;

for(int i=0; i<=n; i++)
{
cin>>p>>w;
cout<<potega(p, w);
}

Przeczytaj dokładnie treść zadania. Tu nie chodzi o wynik potegowania.

Podpinam się, robiłem ten program już na wiele sposobów Pętlą teraz biblioteka matematyczna, było wszystko w mainie, było funkcjami pisane, a ciągle coś. Wcześniej, że przekroczono limit czasu, później błąd kompilacji, a teraz wywala błędną odpowiedź, dla kodu:

include

include

using namespace std;
int main()
{
long int l; //how many loops
long double a, b; // a^b
//int result;
long double re;
cin >> l;
for (int i = 0; i < l; i++)
{
cin >> a >> b;
re = pow(a, b);

	while (re > 10)
	{
		re = fmod(re,10);
	}
	cout << re << endl;
	}


}

Pisanie programu zaczynamy od myślenia, jeżeli ktoś ma z tym problemy (lub problem trudny), to może sobie pomóc używając kartki i ołówka.

W przypadku kłopotów najpierw czytamy wątek/wątki poświęcone temu zadaniu (najczęściej jest już tam odpowiedź), dopiero później piszemy.

  1. Zastanów się jakie mogą być maksymalne dane wejściowe . Dla liczby 2 do potegi Miliard przy założeniu że miliard razy w pętli mnożysz nie zmieści się w czasie . ( zapewne dlatego dostawałeś komunikat o przekroczeniu czasu - zrób u siebie test na duże liczby ) .

  2. Za mały zakres danych - standartowych typach danych można przechowywać liczby z pewnego zakresu , ale nawet największy typ danych nie przechowa 1 miliard do potęgi miliarda ( niektóre języki programowania mają wbudowaną obsługę dużych liczb ) . Na taką liczbe zabrakło by pamięci na serwerze na którym jest uruchomiony .

  3. Liczby zmiennoprzecinkowe jakie używasz w kodzie powyżej są reprezentowane są w szczególny sposób w pamięci komputera . Można za ich pomocą wyrazić bardzo dużą liczbe ale dzieje się to kosztem jej dokładności na miejscach mniej znaczących , Double z zapisaną liczbą 10 do potęgi 300 nie możesz potraktować moduło 10 -- bo taka liczba ma około 15 cyfr ( początkowych ) w zapisie dziesiętnym ( na których się wykonuje operacje ) a informacja z dalszych ( w tym ostatnich ) pozycji rozwinięcia dziesiętnego została utracona .

Zrób na swoim komputerze i sprawdź co zwraca kod

re = pow(a, b);
re = fmod(re,10);
cout << re << endl;

dla coraz większych liczb: a ^ b
2^ 10
2^ 11
2^ 12
....
2^100
2^101
.....
2^200
2^201

( Edytor frumo coś szaleje - nie pozwala mi wyliczać punktów - i odlicza znowu od 1 a powinno być 4 )

  1. Zastanów się jak szybko potęgować . Np : czy 5 do potęgi 32 trzeba 32 razy mnożyć aby otrzymać prawidłowy wynik .

  2. Operacje moduło ( arytmetyka moduło ) też charakteryzuje pewna powtarzalność .

  3. Nie możesz zrobić tego zadania bo zapewne nie wiesz o dwóch sztuczkach jakie trzeba znać i umiejętnie zastosować .

28 days later

`#include

using namespace std;
int x,y,test,ilo=1;

int main() {
cin >>test;
for (int i=0;i<test;i++)
{
cin >>x>>y;
for(int g=0;g<y;g++)
{
ilo*=x;
ilo%=10;
}
cout << ilo<< endl;
ilo=1;
}

return 0;

}`

Wywala błąd, nie wiem co zmienić ;-;. Jakaś wskazówka?