[C++] Liczba narcystyczna - optymalność mojego kodu.
Ostatnio zmodyfikowano 2015-02-22 23:01
pekfos |
» 2015-02-22 21:51:39 Według Ciebie ile cykli procesora przypada na liczbę i na cyfrę. |
Nieznana ilość. |
|
Brunon3 |
» 2015-02-22 21:58:36 Według Ciebie ile cykli procesora przypada na liczbę i na cyfrę.
|
Hm... A to dlaczego? ;) |
|
pekfos |
» 2015-02-22 22:11:20 To oblicz. I podaj obliczenia. |
|
michal11 |
» 2015-02-22 22:17:11 I prawdopodobnie przy każdym uruchomieniu programu będzie to inna liczba |
|
Piastlis |
» 2015-02-22 22:43:59 Zamiast hejtować zrobiłbyś coś konstruktywnego. Ja zastanowiłem się jeszcze raz... kilka linijek kodu i czas spadł do 56 sekund. #include <iostream> #include <math.h> #include <time.h> using namespace std; int potega[ 10 ][ 19 ]; int policzcyferki( int n ) { int i; for( i = 0; n > 0; i++ ) n = n / 10; return( i ); } int main() { for( int n = 0; n <= 18; n++ ) for( int licz = 0; licz <= 9; licz++ ) potega[ licz ][ n ] = pow( licz, n ); time_t start, koniec; time( & start ); for( int ln = 1; ln <= 1e9; ln++ ) { int suma = 0; int lnp = ln; int cyferki = policzcyferki( ln ); for( int n = 1; n <= cyferki; n++ ) { int pom = lnp / 10; suma = suma + potega[ lnp - 10 * pom ][ cyferki ]; lnp = pom; } if( ln == suma ) cout << ln << endl; if( suma > ln ) { if( ln / 100 * 100 == ln ) if( ln / 1000 * 1000 == ln ) if( ln / 10000 * 10000 == ln ) ln = ln / 10000 * 10000 + 9999; else ln = ln / 1000 * 1000 + 999; else ln = ln / 100 * 100 + 99; else ln = ln / 10 * 10 + 9; } } time( & koniec ); double roznica = difftime( koniec, start ); cout.precision( 6 ); cout << "Obliczenia zajely Ci: " << roznica << " sekund " << endl; return 0; }
Wynik wygląda tak: 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084 548834 1741725 4210818 9800817 9926315 24678050 24678051 88593477 146511208 472335975 534494836 912985153 Obliczenia zajely Ci: 56 sekund
Process returned 0 (0x0) execution time : 56.453 s Press any key to continue.
A obliczenia są infantylne .... Czas pracy programu * częstotliwość procesora /ilość elementów policzonych.... |
|
pekfos |
» 2015-02-22 22:52:04 for( int n = 0; n <= 18; n++ ) for( int licz = 0; licz <= 9; licz++ ) potega[ licz ][ n ] = pow( licz, n ); |
Liczysz wielokrotnie to samo. A obliczenia są infantylne .... Czas pracy programu * częstotliwość procesora /ilość elementów policzonych.... |
Czyli procesor nie robi niczego innego, tylko sprawdza twoje liczby narcystyczne..? |
|
Piastlis |
» 2015-02-22 23:01:07 1. W tej sekwencji przygotowywuję sobie "gotowca" z wszystkimi możliwymi potęgami jakie będą mi później potrzebne. 2. Podejrz sobie w menadzerze zadań ile czasu poświęca procesor na wykonywanie tego konkretnie programu. |
|
1 2 « 3 » |