[c++] tablice - czas 0.00?

0

Witam.

 
#include <iostream>
using namespace std;

int main()
{
 int n, n2, tab[100];
 cin>>n;
 while(0<n)
 {
          cin>>n2;
          for(int j=0; j<n2; j++)
            cin>>tab[j];
          for(int k=(n2-1); k>=0; k--)
            cout<<tab[k]<<' ';
    n--;
 }
 return 0;
}

Mam może ktoś pomysł jak skrócić czas działania do 0.00 sek?

0
  1. scanf i printf
  2. W warunku while'a samo n
0

jeśli wejście i wyjście jest niezależne, to możesz to zrobić w jednej pętli i bez tablicy

poza tym coś m się kojarzy, że inckrementacja i dekrementacja pre i postfixowa nie są tak samo szybkie, ale nie pamiętam, która była szybsza, w ostateczności poeksperymentuj

0

Thx.
Mam coś takiego:

#include <iostream>
using namespace std;

int main()
{
 int n, n2, tab[100];
 scanf( "%i", &n );
 while(n)
 {
          scanf( "%i", &n2 );
          for(int j=0; j<n2; j++)
           scanf( "%i", &tab[j]);
          for(int k=(n2-1); k>=0; k--)
           printf("%d ", tab[k]);
          n--;
 }
 return 0;
}

czas zmniejszył się do 0.01 sek.
jednak zadowolony byłbym z wyniku 0.00 sek., może ktoś ma inny pomysł na kod programu?

0

kompiluje się :)

0

usunęłem using'a i zmieniłem strumień, jednak czas dalej 0.01sek. :/

0

A jak kompilujesz?
Może jak dodasz -O2 to przyspieszy.
Uruchom z pendrive'a, tam jest szybszy odczyt i zapis dla małych plików.

Zmienne j i k zadeklaruj przed while. Teoretycznie to -O2 powinno zrobić, ale spróbuj

0

O co kaman z tym O2? ...bo nie bardzo rozumiem.

0

Zmienne globalnie, i kompiluj jako kod C. To jest zadanie na SPOJ'a i nie ma on dostępu do linii poleceń.

0

Wystarczy wczytanie całej linii do tablicy znaków za pomocą fgets/gets i wypisanie w pętli, wtedy będzie te 0.0.

0

O2 to ustawienie kompilacji(Optymalizacja). Ale już kompilatory mają O3

0

rozwiązanie t0m_k wydaje się być ciekawe, ale nie bardzo wiem jak to zrobić...

#include <cstdio>

int main()
{
 int n, n2, tab[100], j, k;
 scanf( "%i", &n );
 while(n)
 {
          scanf( "%i", &n2 );
          for(j=0; j<n2; j++)
           scanf( "%i", &tab[j]);
          for(k=(n2-1); k>=0; k--)
           printf("%d ", tab[k]);
          n--;
 }
 return 0;
} 

...może ktoś jest w stanie zmodyfikować kod programu aby zawierał to rozwiązanie, bo ja nie bardzo wiem jak :/

0

Najpierw wywal zmienne jako globalne. Działa szybciej, uwierz Mi.

0

Zaraz, ale to zadanie w końcu ma być z tego spoja czy nie ? Ja odpowiedź napisałem konkretnie pod zadanie "tablica" ze spoja, dla którego Twój kod zwraca w ogóle błędną odpowiedź xD

0
 
#include <cstdio>

int n, n2, tab[100], j, k;
int main()
{
 scanf( "%i", &n );
 while(n)
 {
          scanf( "%i", &n2 );
          for(j=0; j<n2; j++)
           scanf( "%i", &tab[j]);
          for(k=(n2-1); k>=0; k--)
           printf("%d ", tab[k]);
          n--;
 }
 return 0;
}

Tak to zadanie ze SPOJA.
Wywaliłem zmienne jako globalne, jednak dalej 0.01 sek :/

0

Nie wczytywać po kawałku tylko większy bufor, wczytać np. całą linię i ręcznie parsować (jakieś itoa czy coś), bo scanf jest kosztowniejszy.

0

nie bardzo wiem jak... :/

0

jak zamieniasz na C/C99, to zamień nagłówek z cstdio na stdio.h

To znaczy "zejść na jeszcze niższy poziom niż ten, na którym jesteś". Brzmi trochę chamsko, co nie?:)
Na początku używałeś wysokopoziomowych strumieni, teraz niższego poziomu wejścia/wyjścia sformatowanego, a ty musisz zejść jeszcze niżej.

Za bardzo nie wiem jak można to zrobić szybciej wczytując liczby ręcznie przez read.

Może i na scanf by się dało, tylko nie wczytywać liczb, tylko %s, czyli do białego znaku.

I poza tym można by jeszcze tak pętle przerobić:

char tab[100][10]; //taka deklaracja
          for(j=0; j<n2; j++)
           scanf("%s", tab[j]);
          for(j--; j>=0; j--)
           printf("%s ", tab[j]);

z moich testów wczytywanie %s jest wydajniejsze od wczytywania %d/i

0

Poprawiłem kod na taki jak Razi91 doradzał i w kompilacji C pojawił się magiczny czas 0.00 sek., natomiast w kompilacji C++ nadal zostaje 0.01 sek.

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