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) #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). |
|
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. |
|
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. |
|
carlosmay |
» 2016-07-26 05:06:38 sync_with_stdio() lub tie() i różnice czasowe między cout a printf znikają. |
|
mateczek |
» 2016-07-26 09:54:11 dwie cyfry silni dla liczb większych od 10 to 00 |
|
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.htmjest 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+optimalize&qs=n&form=QBRE&pq=c%2B%2B+speed+&sc=0-10&sp=-1&sk=&cvid=EC9B6B0C6DA64E14852F5DB39AAA980Di jest coś takiego http://www.agner.org/optimize/optimizing_cpp.pdfnp. 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. 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 |
|
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 !!! #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; } }
|
|
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. #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; } |
|
« 1 » 2 |