konto usunięte

Temat: rząd liczby [C]

w jaki sposób sprawdzić rząd podanej liczby. w jaki sposób zapisać poniższe założenie?

Rzad(n) jest to najmniejsza liczba 10k taka, że n < 10k
Na przykład Rzad(1) = Rzad (9) = 10, Rzad(10) = Rzad(99) = 100 itd.
Marcin Staniszczak

Marcin Staniszczak Programista Python

Temat: rząd liczby [C]

Na sucho, nie sprawdzałem;-) Pewnie są lepsze sposoby;-)

#include <math.h>

int intlen(float number) {
int length = 0;
while(number > 0) {
number = number/10;
length++;
}
return length;
}

rzad = pow(10, intlen(n))
Marcin Staniszczak edytował(a) ten post dnia 18.11.11 o godzinie 10:44

konto usunięte

Temat: rząd liczby [C]

W sumie nie jest w C...

double logValue= Math.Log(param, 10);
double result = Math.Pow(10, Math.Ceiling(logValue)));
Marcin Staniszczak

Marcin Staniszczak Programista Python

Temat: rząd liczby [C]

Jakub Wojt:
W sumie nie jest w C...

double logValue= Math.Log(param, 10);
double result = Math.Pow(10, Math.Ceiling(logValue)));

Fakt, z logarytmem zdecydowanie lepiej;-)
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: rząd liczby [C]

Kurczę, jakie skomplikowane rozwiązania dajecie :)
Logarytm jest ciężki, a pętla Marcina wymaga zastosowania potęgowania...

Ja bym zrobił tak:


#define MAX_LEVEL=100000000; // zeby był jawny warunek
long Rzad(long n)
{
for (long level = 10; level < MAX_LEVEL; level = level * 10)
if (n < level)
return level;

return -1; // za duża liczba, zadziałał warunek z MAX_LEVEL
}

konto usunięte

Temat: rząd liczby [C]

I kto tu kombinuje ... ;)


long Rzad(long n)
{

int result = 1;
while((result*=10) < n){}
return result;
}

konto usunięte

Temat: rząd liczby [C]

Jakub Wojt:
I kto tu kombinuje ... ;)


long Rzad(long n)
{

int result = 1;
while((result*=10) < n){}[/quote]> return result;[quote]}

A czyj kod się zawiesi dostając na wejście n=LONG_MAX?:P

konto usunięte

Temat: rząd liczby [C]

A czyj kod się zawiesi dostając na wejście n=LONG_MAX?:P

A co będzie trwać dłużej: dodawanie "if (n > MAX_LEVEL / 10) return -1 " czy zamieszczanie 2^31 / 10 posta ?
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: rząd liczby [C]

Jakub, pytanie ma naprawdę sens :)
Ja już kilkanaście lat temu przestałem ufać argumentom funkcji i generalnie danym zewnętrznym (a programuję zawodowo ponad 20 lat).
Jeden 'if' nie boli, a pozwala zaoszczędzić czasem i kilka nocy.
To jest kwestia nawyków - tak, jak wychodząc ze sklepu mówisz "Do widzenia" - chociaż nie trzeba ;) (a może nie mówisz?)
W/g mnie olewanie takich rzeczy to bardzo zły i szkodliwy zwyczaj.
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: rząd liczby [C]

Jakub Wojt:
I kto tu kombinuje ... ;)


long Rzad(long n)
{

int result = 1;
while((result*=10) < n){}[/quote]> return result;[quote]}

A to można prościej:


long Rzad(long n)
{
int result = 1;
while((result*=10) < n);
return result;
}


Klamerki po while są do niczego nie potrzebne (w C# również).Piotr Głudkowski edytował(a) ten post dnia 18.11.11 o godzinie 20:55

konto usunięte

Temat: rząd liczby [C]

Piotr Głudkowski:
Jakub, pytanie ma naprawdę sens :)
Ja już kilkanaście lat temu przestałem ufać argumentom funkcji i generalnie danym zewnętrznym (a programuję zawodowo ponad 20 lat).

A jednak zakładasz(ja z resztą też..), że n jest zawsze większe od zera ...
Jeden 'if' nie boli, a pozwala zaoszczędzić czasem i kilka nocy.

'if'y' bolą... właśnie w związku z tym powstało coś takiego jak modelowanie obiektowe ... ale to tak tylko na marginesie.
To jest kwestia nawyków - tak, jak wychodząc ze sklepu mówisz "Do widzenia" - chociaż nie trzeba ;) (a może nie mówisz?)
W/g mnie olewanie takich rzeczy to bardzo zły i szkodliwy zwyczaj.

ok. to załóżmy, że n = 2 ^ 256 :>
Kto na to zrobi "MAX_LEVEL" ?

konto usunięte

Temat: rząd liczby [C]

[...]

A to można prościej:


long Rzad(long n)
{
int result = 1;
while((result*=10) < n);[/quote]> return result;[quote]}


Klamerki po while są do niczego nie potrzebne (w C# również).

no i właśnie oblałem rozmowę kwalifikacyjną ... ;)

konto usunięte

Temat: rząd liczby [C]

Jakub Wojt:
ok. to załóżmy, że n = 2 ^ 256 :>
Kto na to zrobi "MAX_LEVEL" ?
sizeof()?

Temat: rząd liczby [C]

Jakub Wojt:
Piotr Głudkowski:
Jakub, pytanie ma naprawdę sens :)
Jeden 'if' nie boli, a pozwala zaoszczędzić czasem i kilka nocy.

'if'y' bolą... właśnie w związku z tym powstało coś takiego jak modelowanie obiektowe ... ale to tak tylko na marginesie.
Możesz rozwinąć?

konto usunięte

Temat: rząd liczby [C]

result powinien być chyba "long", żeby być precyzyjnym...
A że przypisanie w warunku jest mało kosmetyczne to moja wersja wygląda tak:


long Rzad(long n)
{
long result = 1;

while(result < n)
result *= 10;

return result;
}


Nikt jeszcze chyba nie podał wersji z szablonami - podobnie jak z logarytmami czas wykonania O(1):
(przykład na to na ile można to zrobić sposobów)


#include <iostream>
#include <cassert>

using namespace std;

template <int Rz> struct Rzad {
static const int value = (10 > Rz)? 10 : 10 * Rzad<Rz/10>::value;
};

template <> struct Rzad<0> {
static const int value = 10;
};

template <> struct Rzad<1> {
static const int value = 10;
};

int main()
{
cout << "Rzad(1) = " << Rzad<1>::value << endl;
cout << "Rzad(2) = " << Rzad<2>::value << endl;
cout << "Rzad(22) = " << Rzad<22>::value << endl;
cout << "Rzad(222) = " << Rzad<222>::value << endl;
}


Wynik:
http://ideone.com/57Uxy

Edit: poprawiłem dla 0 i 1, bo chyba nie było do końca poprawnie.Piotr L. edytował(a) ten post dnia 20.11.11 o godzinie 15:45

konto usunięte

Temat: rząd liczby [C]

Wersja z szablonami jest super :)

konto usunięte

Temat: rząd liczby [C]

Piotr Głudkowski:
Jakub, pytanie ma naprawdę sens :)
Jeden 'if' nie boli, a pozwala zaoszczędzić czasem i kilka nocy.

'if'y' bolą... właśnie w związku z tym powstało coś takiego jak modelowanie obiektowe ... ale to tak tylko na marginesie.
Możesz rozwinąć?

W maksymalnym skrócie:

http://en.wikipedia.org/wiki/Cyclomatic_complexity#Des... - dlatego im więcej IF'ów tym gorzej.

http://en.wikipedia.org/wiki/Object-oriented_programmi... - akapit 5

oop - ma kod upraszczać; if'y kod komplikują.
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: rząd liczby [C]

Piotr L.:
Nikt jeszcze chyba nie podał wersji z szablonami - podobnie jak z logarytmami czas wykonania O(1):
(przykład na to na ile można to zrobić sposobów)

O(1) ale chyba po ukonkretnieniu szablonu? W runtime (tzn. program prosi o podanie liczby na wejściu), chyba nie będzie to O(1) ? :)

konto usunięte

Temat: rząd liczby [C]

Paweł Grzegorz Kwiatkowski:
Piotr L.:
Nikt jeszcze chyba nie podał wersji z szablonami - podobnie jak z logarytmami czas wykonania O(1):
(przykład na to na ile można to zrobić sposobów)

O(1) ale chyba po ukonkretnieniu szablonu? W runtime (tzn. program prosi o podanie liczby na wejściu), chyba nie będzie to O(1) ? :)

O(1) w runtime, to rozwiązanie nie działa ze zmiennymi (chyba że potrafisz je tak wykorzystać) ;)

Zwykle nazywa się to obliczeniami w czasie kompilacji ("compile time computation", "compile time programming"), więcej o tym w bardzo podobnym przykładzie jest w "Thinking in C++ vol 2".

Zatem w czasie kompilacji to złożoność O(log10(n)), a w czasie uruchomienia O(1).Piotr L. edytował(a) ten post dnia 20.11.11 o godzinie 17:55
Mateusz Herych

Mateusz Herych Arch Linux TU,
Student PK

Temat: rząd liczby [C]

@Jakub,
Ale nie przesadzajmy z modelowaniem obiektowym w takich zastosowaniach.
Spójrz jak wyglądają klasy (np. w javie) odpowiedzialne za dostarczanie podstawowych struktur danych, czy algorytmów np. sortowania. Ifów tam nie brakuje.Mateusz Herych edytował(a) ten post dnia 20.11.11 o godzinie 17:11



Wyślij zaproszenie do