[C++]rozbijanie liczb całkowitych

diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++]rozbijanie liczb całkowitych

Post autor: diego_maradona » 8 wrz 2011, o 16:47

Powiedzmy że mam w programie zadeklarowaną zmienną typu int

Kod: Zaznacz cały

int number = 84515259 
Co zrobić, żeby pobrać pierwszą cyfrę do zmiennej firstDigit?

abc666

[C++]rozbijanie liczb całkowitych

Post autor: abc666 » 8 wrz 2011, o 17:17

Pierwszą tzn. pierwszą z lewej czy z prawej?

diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++]rozbijanie liczb całkowitych

Post autor: diego_maradona » 8 wrz 2011, o 17:31

Z lewej.

Afish
Moderator
Moderator
Posty: 2823
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 354 razy

[C++]rozbijanie liczb całkowitych

Post autor: Afish » 8 wrz 2011, o 18:02

1. Zrzutować na stringa / cstringa i wyciągnąć pierwszy znak
2. Dzielić przez 10 aż do otrzymania zera. Wtedy ostatnia niezerowa liczba jest tą poszukiwaną.

abc666

[C++]rozbijanie liczb całkowitych

Post autor: abc666 » 8 wrz 2011, o 18:05

Jeśli to nie jest jakiś kluczowy element algorytmu to można np. tak

Kod: Zaznacz cały

int first = number;
while(first>10) first /= 10;

Afish
Moderator
Moderator
Posty: 2823
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 354 razy

[C++]rozbijanie liczb całkowitych

Post autor: Afish » 8 wrz 2011, o 18:10

abc666, nie zadziała dla liczb ujemnych.

abc666

[C++]rozbijanie liczb całkowitych

Post autor: abc666 » 8 wrz 2011, o 18:23

Szczegóły :p

Xitami

[C++]rozbijanie liczb całkowitych

Post autor: Xitami » 8 wrz 2011, o 19:31

Kod: Zaznacz cały

while( first>9 ) first /=10;
Ostatnio zmieniony 8 wrz 2011, o 19:40 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości.

adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[C++]rozbijanie liczb całkowitych

Post autor: adambak » 8 wrz 2011, o 19:38

funkcja http://www.cplusplus.com/reference/clib ... o/sprintf/
załatwi sprawę, pierwszy znak tablicy charów to będzie szukana cyfra..

Xitami

[C++]rozbijanie liczb całkowitych

Post autor: Xitami » 8 wrz 2011, o 20:50

Kod: Zaznacz cały

unsigned int firstdigit(unsigned int n) {
 if(100000<=n)
  if(100000000<=n)
   if(1000000000<=n) return n/=1000000000;
   else return n/=100000000;
  else
   if(10000000<=n) return n/=10000000;
   else
    if(1000000<=n) return n/=1000000;
    else return n/=100000;
 else
  if(1000<=n)
   if(10000<=n) return n/=10000;
   else return n/=1000;
  else
   if(100<=n) return n/=100;
   else
    if(10<=n) return n/=10;
    else return n;
}
by było czytelniej wersja bardziej zwięzła

Kod: Zaznacz cały

#define         _0      /10;
#define         _7      _0 else
#define         _8      <=n)
#define         _9      return n/=
#define         _1      int firstdigit(unsigned int n) {if(
#define         _2      _8 if(
#define         _3      _8 _9
#define         _4      _7 _9
#define         _5      _7 if(
#define         _6      _0}//

_1 100000 _2 100000000 _2 1000000000 _3 10000000000 _4 1000000000 _5 10000000 _3 100000000 _5 1000000 
_3 10000000 _4 1000000 _5 1000 _2 10000 _3 100000 _4 10000 _5 100 _3 1000 _5 10 _3 100 _4 10 _6

diego_maradona
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 16 cze 2010, o 00:59
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 80 razy

[C++]rozbijanie liczb całkowitych

Post autor: diego_maradona » 10 wrz 2011, o 14:07

Afish pisze:1. Zrzutować na stringa / cstringa i wyciągnąć pierwszy znak
2. Dzielić przez 10 aż do otrzymania zera. Wtedy ostatnia niezerowa liczba jest tą poszukiwaną.
Ta pierwsza metoda wydaje się dużo łatwiejsza

Xitami

[C++]rozbijanie liczb całkowitych

Post autor: Xitami » 10 wrz 2011, o 17:42

Kod: Zaznacz cały

O11(O1l)<%return O1l/*->*/>011?O11(O1l/(011+'/'/'/')):O1l;%>
 
main(d){
        for(d=10; d<1000; d+=d/10)
                printf("%3d %d\n", d, O11(d));
}
działanie można sprawdzić dzięki ideone.com

ODPOWIEDZ