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

[C++] Liczba narcystyczna - optymalność mojego kodu.

Ostatnio zmodyfikowano 2015-02-22 23:01
Autor Wiadomość
pekfos
» 2015-02-22 21:51:39
Według Ciebie ile cykli procesora  przypada na liczbę i na cyfrę.
Nieznana ilość.
P-127174
Brunon3
» 2015-02-22 21:58:36
Według Ciebie ile cykli procesora przypada na liczbę i na cyfrę.
Nieznana ilość.

Hm... A to dlaczego? ;)
P-127177
pekfos
» 2015-02-22 22:11:20
Hm... A to dlaczego? ;)
To oblicz. I podaj obliczenia.
P-127188
michal11
» 2015-02-22 22:17:11
I prawdopodobnie przy każdym uruchomieniu programu będzie to inna liczba
P-127190
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.
C/C++
#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....






P-127191
pekfos
» 2015-02-22 22:52:04
C/C++
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..?
P-127192
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.
 
P-127193
1 2 « 3 »
Poprzednia strona Strona 3 z 3