Liczenie ile cyfr ma liczba C++

Odpowiedz Nowy wątek
2019-04-13 23:12

Rejestracja: 1 rok temu

Ostatnio: 1 rok temu

0

Cześć. Napisałby mi ktos kod programu który liczy ile cyfr ma liczba. (np 425 składa sie z 3 cyfr) w c++
To mój kod ale on nie działa (nie wiem czemu)

#include <iostream>

using namespace std;

int main()
{

double x;
cin>>x;
    for(int i=0; x<1; i++)
{
    cout << x/10 << i;
}

}
edytowany 2x, ostatnio: ŁF, 2019-04-15 11:47

Pozostało 580 znaków

2019-04-13 23:34

Rejestracja: 17 lat temu

Ostatnio: 3 godziny temu

0

Jak sprawdzić, ile cyfr ma liczba?
Wszystko mniejsze od 10 to jedna cyfra.
Potem wszystko mniejsze od 100 to dwie cyfry.
Potem wszystko mniejsze od 1000 to trzy cyfry.
...
Jeśli w pętli będziesz daną liczbę l porównywał do kolejnych iteracji liczby 10 (jedną zmienną t = 1 w każdym obrocie pętli mnożysz przez 10), to po numerze iteracji dojdziesz do ilości cyfr. Kiedy nierówność l < t zostanie spełniona, to wychodzimy z pętli i wypisujemy numer iteracji.

edytowany 4x, ostatnio: Spine, 2019-04-13 23:40

Pozostało 580 znaków

2019-04-13 23:44

Rejestracja: 6 lat temu

Ostatnio: 4 tygodnie temu

0

Pewnie da się do jakoś lepiej zapisać żeby nie robić milion ifów dla milion cyfrowej liczby, ale łeb mnie już boli i idę spać zaraz

#include <iostream>

using namespace std;

int main()
{
    double x;
    cin>>x;
    if(x/10000>=1)
        cout<<"Pięciocyfrowa\n";
    else if(x/1000>=1)
        cout<<"Czterocyfrowa\n";
    else if(x/100>=1)
        cout<<"Trzycyfrowa\n";
    else if(x/10>=1)
        cout<<"Dwucyfrowa\n";
    else if(x/1>=1)
        cout<<"Jednocyfrowa\n";
    else
        cout<<"Zerocyfrowa?\n";
}
edytowany 2x, ostatnio: au7h, 2019-04-13 23:45
Hmmm, to taki joke, prawda? - Spine 2019-04-13 23:48

Pozostało 580 znaków

2019-04-13 23:53

Rejestracja: 1 rok temu

Ostatnio: 6 godzin temu

1

Hmm... @Kuba021, a takiej funkcji możesz używać? log10()

Pozostało 580 znaków

2019-04-14 00:02

Rejestracja: 2 lata temu

Ostatnio: 1 godzina temu

Lokalizacja: Nether

1

ja zawszę konwertuje inta na stringa i liczę ile jest znaków. Działa? działa.

int n;
std::cin >> n;
int nToString = std::to_string(n).length();
std::cout << nToString; //np.

In C++ we don't say "Missing asterisk" we say "error C2664: 'void std::vector<block,std::allocator<_Ty>>::push_back(const block &)': cannot convert argument 1 from 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<block>>>' to 'block &&'"
I jest do d*? Jest ! :-/ - Mokrowski 2019-04-14 12:21
no ale skoro tak uważasz to napisz czemu, bo właśnie taka opinia jest do d* :) - Sunnydev 2019-04-14 12:25
Oczywiście: Przykład z rozwiązaniem "przez string". Byłem uprzejmy i dodałem optymalizację "na wielkość": https://godbolt.org/z/5RDQ2k Przykład z logarytmem: https://godbolt.org/z/vgn4rZ Myślę że widać... Oczywiście można sobie odpuścić w jakimś Pythonie czy JS, ale od C i C++ wymaga się permanentnie wysokiej wydajności. Tu ma się "hopla" na tym punkcie... :-> - Mokrowski 2019-04-14 12:29
w porządku, masz rację, nie jest to wydajne, ale do zadań na studiach czy jakieś inne codility jest to wystarczające. Z resztą to tylko propozycja - to od @op zależy czy tego użyje, w końcu w wątku jest podane mnóstwo rozwiązań. - Sunnydev 2019-04-14 12:34
https://godbolt.org/z/STmv4c Aż się zdziwiłem, że mi się udało równie krótki kod wygenerować bez log10 :) Oba: http://cpp.sh/5vuxk - darkbit 2019-04-16 10:41

Pozostało 580 znaków

2019-04-14 01:36

Rejestracja: 2 lata temu

Ostatnio: 4 miesiące temu

0

Wystarczy policzyć ile razy trzeba podzielić liczbę przez 10, zanim liczba zejdzie do zera.


Nie pisz na priv. Zadaj dobre pytanie na forum.

Pozostało 580 znaków

sig
2019-04-14 06:59
sig

Rejestracja: 9 lat temu

Ostatnio: 1 minuta temu

2

Ta liczba może mieć przecinek? Jak tak, to chyba tylko wspomniana konwersja na string i potem usunięcie / odliczenie tegoż. Bo porównanie z potęgami 10 np dla 2.51 da błędy wynik, dzielenie przez 10 też nie zadziała. Pytam bo w pierwszym poście autor używa double (czyli typu z przecinkiem).

edytowany 1x, ostatnio: sig, 2019-04-14 06:59

Pozostało 580 znaków

2019-04-14 11:58

Rejestracja: 5 lat temu

Ostatnio: 8 godzin temu

3

Korzystając z własności logarytmu:

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
  int i = 123123;

  printf("%d\n", (int)log10(i)+1);

  return 0;
}

My to na arm napiszemy wszystko i zrobimy co chcemy tyle że 90% kodu to biblioteki z netu albo robota kompilatora Zdajesz sobie sprawę że tak na prawdę wyższy poziom języka może świadczyć jedynie o tym jak niskim poziomem wiedzy może dysponować bałwan,który nazwie się w rezultacie programistą i napisze działający program wciskając zleceniodawcy że tam to akurat musi być 100MHz ARM z 1M pamięci bo tak na prawdę jego pusta łepetyna nie potrafi zrealizować czegoś na innym słabszym mikrokontrolerze

Pozostało 580 znaków

2019-04-15 09:26

Rejestracja: 1 rok temu

Ostatnio: 2 tygodnie temu

1

Dla zera rozwiązanie z logarytmem nie będzie działało. We wszystkich podanych rozwiązaniach typ ze znakiem, więc dla liczb ujemnych będą błędy przy obliczaniu ilości cyfr.

int nToString = n ? log10(abs(n)) + 1: 1; ... oczywiście jeśli obsługa zmiennego przecinka nie jest dostępna na danej platformie, iterować dzieląc będzie dopuszczalnym rozwiązaniem. Z całą pewnością konwersja przez string nie wygra z tymi sposobami co do wydajności. - Mokrowski 2019-04-16 12:42

Pozostało 580 znaków

2019-04-15 14:17

Rejestracja: 1 rok temu

Ostatnio: 2 miesiące temu

0

Mozesz to zrobic np tak

#include<iostream>
using namespace std;

int a,ile_cyfr;

int main()
{
    cin>>a;
    do{
        ile_cyfr++;
        a /= 10;
    }while(a != 0);
    cout<<ile_cyfr;
}

Pozostało 580 znaków

2019-04-15 14:22

Rejestracja: 6 lat temu

Ostatnio: 48 sekund temu

0

Dla a typu double, warunek w pętli wystarczy zamienić na while (a >= 1).

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0