161 / 237
Sep 2017

Zdaje sobie sprawę, że mój kod nie jest optymalny. Dziękuję za cenne wskazówki :slight_smile: ogólnie to planuje robić przynajmniej 2 zadania ze spoja na tydzień

> #include <iostream>
> 
> using namespace std;
> 
> int main()
> 
> {
> int ile;
> 
> cin >> ile;
> 
> int *tab1 = new int[ile];
> int *tab2 = new int[ile];
> 
> for (int i = 1; i <= ile; i++)
> {
> 	cin >> tab1[i] >> tab2[i];
> 
> }
> 
> for (int i = 1; i <= ile; i++)
> {
> 	if (tab2[i] == 0) cout << 1;
> 	else
> 	{ 
> 	switch (tab1[i]%10)
> 	{
> 	case 0: cout << 0<<endl; break;
> 	case 1: cout << tab1[i]%10 << endl; break;
> 	case 2: 
> 		switch (tab2[i]%4)
> 		{
> 		case 0: cout << 6 << endl; break; 
> 		case 1: cout << 2 << endl; break;
> 		case 2: cout << 4 << endl; break;
> 		case 3: cout << 8 << endl; break;
> 		} break; 
> 	case 3:
> 		switch (tab2[i] % 4)
> 		{
> 		case 0: cout << 1 << endl; break;
> 		case 1: cout << 3 << endl; break;
> 		case 2: cout << 9 << endl; break; 
> 		case 3: cout << 7 << endl; break;
> 		} break; 
> 	case 4:
> 		switch (tab2[i] % 2)
> 		{
> 		case 0: cout << 6 << endl; break;
> 		case 1: cout << 4 << endl; break;
> 		} break;
> 	case 5: cout << 5 << endl; break;
> 	case 6: cout << 6 << endl; break;
> 	case 7:
> 		switch (tab2[i] % 4)
> 		{
> 		case 0: cout << 1 << endl; break;
> 		case 1: cout << 7 << endl; break;
> 		case 2: cout << 9 << endl; break;
> 		case 3: cout << 3 << endl; break;
> 		} break;
> 	case 8:
> 		switch (tab2[i] % 4)
> 		{
> 		case 0: cout << 6 << endl; break;
> 		case 1: cout << 8 << endl; break;
> 		case 2: cout << 4 << endl; break;
> 		case 3: cout << 2 << endl; break;
> 		} break;
> 	case 9:
> 		switch (tab2[i] % 2)
> 		{
> 		case 0: cout << 1 << endl; break;
> 		case 1: cout << 9 << endl; break;
> 		} break;
> 
> 	}
> 
> 
> 	}
> 
> 	
> 
> }
> 
> system("pause");
> return 0;

Mam taki kod, wiem że długaśny, jednak liczy bez wielkich obliczeń i szybko, jednak SPOJ go nie przepuszcza. Gdzie jest błąd?

Postaraj się poprawniej wklejać kod.
Poczytaj o tablicach i indeksach.

PS
Nie istotne, ale na spoju nie nie ma “pause”. Gdyby było/a to miałbyś TLE.

Jak testuje u siebie to wszystko działa poprawnie. Możesz sprecyzować o co chodzi z tymi indeksami i tablicami?

np dla ile = 10
tab1[0]

tab1[9]
a nie
tab1[1]

tab1[10]

PS
To nie jest poprawne wklejenie kodu :wink:

4 months later

Witam.
Od 2 dni walczę z tym banalnym programem i niestety poległem. Czy mógłbym liczyć na jakąś podpowiedź?
Poniżej kod:

int main()
{
int a,b,D;
unsigned long long wynik;
do
{
    cin>>D;
}
while (D<1 || D>10);
for (int k=0 ; k<D ; k++)
{
    cin>>a;
    cin>>b;

    if (b==0)
    {
        wynik=1;
    }
    else if ((a%10==0) || (a%10==1) || (a%10==5) || (a%10==6))
        {
            wynik=a;
        }
    else
        {
            wynik=1;
            for (int i=0 ; i<b ; i++)
            {
                wynik*=a;
            }
        }
cout<<wynik%10<<endl;
}
return 0;
}

SPOJ wywala błąd związany z limitem czasowym.
Każda podpowiedź będzie na wagę złota.
Z góry dziękuję.

powyżej twojego postu jest blisko setka podpowiedzi - wystarczy je przeczytać

gdybym nie czytał to na nie umieszczałbym tego posta w tym temacie.

Witam,
Napisalem taki oto kod:

#include
#include
using namespace std;

int main()
{
int n;
long long int x;
cin>>n;
int *l = new int[n];
int *w = new int[n];

for(int i=0;i<n;i++)
    cin>>l[i]>>w[i];

for(int i=0;i<n;i++){;
    x=pow(l[i],w[i]);
    cout<<"x: "<<x<<endl;
    cout<<x%10<<endl;
}
return 0;

}

Mogby mi ktos powiedziec dlaczego po wpisaniu danych 1 33 4 moj x wynosi 1185920 a nie 1185921?

ten problem był omówiony w tym wątku co najmniej 10 razy (ale raczej więcej) - więc poszukaj odpowiedzi powyżej

2 months later

SPOJ zaakceptował mi rozwiązanie tego problemu, a tymczasem wiem, że mój kod daje błędny rezultat w Code::Blocks dla niektórych potęg liczb kończących się na 5 (np.: dla 5^2, 5^3, 5^5 daje ostatnią liczbę 4, a dla 5^1 daje 5). Z czego niepoprawny wynik podawany przez codeblocks może wynikać? Kod wydaje się dobry i dla wszystkich innych przypadków daje dobre rezultaty.

to już było kilka razy tłumaczone - nie należy używać codeblocks, ani funkcji pow() dla typu integer :slight_smile:

biblioteka matematyczna codeblocks ma błąd i pow(5, 2) daje wynik 24,99999… więc po rzutowaniu na integer jest to 24

Dzieki za odpowiedź. Chociaż w sumie to dziwne, bo jak wpisać bezpośrednio pow(5,2), pow(5,3), pow(5,4) to daje prawidłowy wynik. Jak sprawdzam co wkłada do funkcji pow() to też są to prawidłowe liczny typu int.
Ale ok, przyjmuję, że to jakiś błąd w code::blocks…

1 month later

Witam , robiac wlasnie to zadanie napotkalem pewien problem
moj kod na ideone: https://ideone.com/WCsQWu9
A mianowicie , dla 3 potergi liczby 5 wychodzi mi wynik 124 , ktos ma pomysl dlaczego?

Z jakiej choinki się urwałeś? Albo inaczej, jak mam Ci pomóc, skoro nie umiesz czytać?

I nie przeczytałem tego wątku!?

Moja wina , nie chcialem przeczytac watku zeby przypadkiem nie zobacyzc odpowiedzi na zadanie w komentarzach . Nad wiekszoscia zadan siedze az je zrobie i nie chce prosic nikogo o pomoc , ale w tym chcialem sie upewnic czy to nie przypadkiem wina kompilatora
Tak czy inaczej dzieki

3 months later

Witam proszę o podpowiedź jak zrobić modulo z liczby wpisanej jako double.
Jeżeli zmienię na inta to 5 do 2 daje mi jako 24 a to zły wynik.
Sam wpadłem na to że daną trzeba zmienić na double ale w tedy niestety modulo nie chce mi
liczyć. Proszę o jakieś sugestie co zrobić. Mój kod:

#include
#include
#include

using namespace std;

double a, b, wynik, ile;

int main()
{
cin>>ile;
for (int i=0; i<=ile; i++)
{
cin>>a>>b;
wynik=pow(a,b);
cout<<wynik % 10;
}

return 0;

}

Popatrz wyżej jak przekazujemy kod. Masz dwie opcje do wyboru:

  1. Zalecana: przez serwis ideone wraz z przykładowym wejściem
  2. Przez taki przycisk podczas pisania wiadomości "</>

Bo chyba widzisz, że:

mało nam mówi, prawda?