Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czas wykonywania programu

Ostatnio zmodyfikowano 2016-07-30 09:26
Autor Wiadomość
kisiel7
Temat założony przez niniejszego użytkownika
Czas wykonywania programu
» 2016-07-25 23:26:54
Ostatnio piszę trochę na spoju i w wielu zadaniach mam napisane, że przekroczyłem limit czasu, między innymi przez to nauczyłem się zamiast cin i cout używać prontf i scanf, ale to niewiele i tak dało. Tutaj dla przykładu podam jeden z moich kodów(zadanie o nazwie 2 cyfry silnii)
C/C++
#include<stdio.h>
#include<sstream>
using namespace std;
int main()
{
   
    int D; scanf( "%d", & D );
    int * liczba;
    liczba = new int[ D ];
    int * n;
    n = new int[ D ];
    int * wskaznik1 = n;
    int * wskaznik2 = liczba;
    for( int i = 1; i <= D; i++ )
    {
        stringstream transf;
        string znak;
        scanf( "%d", &* wskaznik1 );
        for( int j = * wskaznik1 - 1; j >= 2; j-- )
        { * wskaznik1 = * wskaznik1 * j; }
        transf << * wskaznik1;
        transf >> znak;
        * wskaznik2 = znak.length();
        if( * wskaznik2 == 1 )
             printf( "0 %c \n", znak[ * wskaznik2 - 1 ] );
        else
             printf( "%c %c \n", znak[ * wskaznik2 - 2 ], znak[ * wskaznik2 - 1 ] );
       
        wskaznik1++;
        wskaznik2++;
    }
    delete[] n;
    delete[] liczba;
    return 0;
}
Było jeszcze kilka wersji np. w której silnię obliczyłem przy pomocy fuunkcji rekurencyjnej, czy bez wskaźników, ale czas programu jest i tak za długi. Jak to poprawić(ogólnie przy wszystkich programach).
P-150254
michal11
» 2016-07-26 00:17:19
Otwórz excela oblicz silnię dla liczb od 1 do 15 i napisz poprawny algorytm.

Zwykle właśnie zbyt długi czas wykonywania wynika ze złego algorytmu a nie z rzeczy typu zamiana cout na printf.
P-150255
kisiel7
Temat założony przez niniejszego użytkownika
» 2016-07-26 00:29:40
"Otwórz excela oblicz silnię dla liczb od 1 do 15 i napisz poprawny algorytm." O co ci chodzi człowieku? "Zbyt długi czas wykonywania wynika ze złego algorytmu a nie z rzeczy typu zamiana cout na printf". To mi odkrycie.
P-150257
carlosmay
» 2016-07-26 05:06:38
sync_with_stdio() lub tie() i różnice czasowe między cout a printf znikają.
P-150258
mateczek
» 2016-07-26 09:54:11
dwie cyfry silni dla liczb większych od 10 to 00
P-150259
darko202
» 2016-07-26 10:10:32
> Jak to poprawić(ogólnie przy wszystkich programach).
przeczytaj i "zrozum" jakiś tekst o optymalizacji kodu
tak na szybko znalazłem
http://www.tantalon.com/pete​/cppopt/main.htm
jest dosyć szczegółowy i jest nad czym się zastanawiać
na pewno są inne nawet lepsze.

kliknąłem kolejny link w http://www.bing.com/search​?q=c%2B%2B+speed+program+optima​lize​&qs=n&form=QBRE​&pq=c%2B%2B+speed+&sc=0-10​&sp=-1&sk=​&cvid=EC9B6B0C6DA64E14852F5DB39AAA980D

i jest coś takiego
http://www.agner.org/optimize​/optimizing_cpp.pdf
np. 7 The efficiency of different C++ construct
 
moja rada :
musisz szukać i zrozumieć :-(

> obliczyłem przy pomocy funkcji rekurencyjnej, czy bez wskaźników
> czas programu jest i tak za długi

analizując przedstawiony kod widzę, że nie rozumiesz optymalizacji kodu przy pomocy wskaźników :-(
bo co optymalizowałeś - "odczytywanie indeksu w kontenerze"

wydaje mi się, że czytałem iż "optymalizacja wskaźnikowa daje wyraźny zysk przy odczytywania złożonych obiektów" np. n-ty element tablicy
czyli np.
C/C++
int t[ 5 ];

for( int i = 0; i < 5; ++i )
     cout << t[ i ] << endl;

for( int * p = t; p < t + 5; ++p )
     cout << * p << endl;


*p powinno być szybsze od t[  i]

bo w *p odwołujemy się do konkretnej komórki pamięci
a t najpierw do tablicy a potem do elementu i tej tablicy

w przedstawionym kodzie w odwołaniu do "*i", oraz "i"  nic nie zyskujemy

szukałem dla string[ i ] przez wskaźnik, ale na razie nie widzę
- język C++ oferuje gotowe kontenery, podobne do dynamicznie alokowanych tablic, ale zdecydowanie wygodniejsze - jak np. klasa vector, czy klasa string dla łańcuchów znaków
z https://pl.wikibooks.org/wiki​/C/Wska%C5%BAniki_-_wi%C4%99cej
z tego wynika, że wsadzanie do takiego kontenera wskaźników  - nic nie daje - co sam obserwujesz
 
P-150260
mateczek
» 2016-07-26 13:16:32
@darko tu trzeba wymyślić szybki algorytm a nie bawić się na siłę w jakieś tam wskaźniki !!!
C/C++
#include <iostream>
using namespace std;
int liczba, wynik, i, liczbaT;
int main() {
    cin >> liczbaT;
    while( liczbaT-- ) {
        cin >> liczba;
        wynik = 1;
        if( liczba < 10 ) {
            for( i = liczba; i > 0; i-- ) {
                wynik = wynik * i;
                wynik = wynik % 100;
                if( wynik == 0 ) break;
               
            }
        } else wynik = 0;
       
        cout << wynik / 10 << ' ' << wynik % 10 << endl;
    }
}
P-150261
kisiel7
Temat założony przez niniejszego użytkownika
» 2016-07-26 18:56:10
Zgadzam się z przedmówcą, ale albo ja coś robię źle albo w spoju coś się popsuło, ale program Mateczka też jest za długi czasowo. Może zmodyfikuje go i trochę przyspieszy, ale ten else sprytnie pomyślany.
Narazie się wskaźnikami nie bawiłem.
C/C++
#include <iostream>
using namespace std;
int liczba, i, liczbaT;
int main() {
    cin >> liczbaT;
    while( liczbaT-- )
    {
        cin >> liczba;
        if( liczba < 10 )
        {
            for( i = liczba - 1; i > 0; i-- )
            {
                liczba = liczba * i;
                liczba = liczba % 100;
                if( liczba == 0 ) break;
               
            }
        } else liczba = 0;
       
        cout << liczba / 10 << ' ' << liczba % 10 << endl;
    }
    return 0;
}
P-150272
« 1 » 2
  Strona 1 z 2 Następna strona