Skocz do zawartości

Wyświetlanie największej cyfry z liczby Cpp


Dazai
 Udostępnij

Rekomendowane odpowiedzi

  • Ekspert

Hi, tym razem to ja potrzebuje jakiegoś nakierowania. Muszę napisać program, który po wczytaniu jakiejś liczby całkowitej wyświetli największą cyfrę występującą w jej zapisie, czyli dla 29237 wyświetli 9, a dla 12 wyświetli 2. Pomyślałem aby wczytaną liczbę dzielić z resztą przez 10 i w ten sposób skracać ją o ostatnią cyfrę.

x = x%10
n = x;

No i wstawić to do pętli, ale problem jest taki, że nie mam pojęcia jak zapisywać kolejne cyfry, które wyrzucam z liczby a następnie porównać, która z nich jest największa. Nie mogę przecież non stop zapisywać je w zmiennej n bo w ten sposób dojdzie do nadpisania, prawda?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

Wydaje mi się że można by było tutaj wykorzystać tablicę każdą cyfrę osobno wkładać do szufladki a następnie je porównać i wypisać największą.

Aczkolwiek nie wiem jak to zapisać bo dawno się nie bawiłem w takie rzeczy ☺️

Edytowane przez FrageN
Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

Mówimy o C?

Żeby nie męczyć się za bardzo ja bym spróbował zrobić w ten sposób:

  1. Pobrać całą liczbę od użytkownika.
  2. Preparsować ją na stringa - po stringu możesz się poruszać jak po tablicy.
  3. Przelecieć tego stringa i przypisać poszczególne cyferki do tablicy intów.
  4. Wykorzystać wbudowaną funkcję max() i wyświetlić liczbę.

Nie piszę, że to optymalny sposób, ale powinno zadziałać

W sumie z tym pomysłem dzielenia przez 10, to też dobry pomysł, ale musiałbyś zacząć dzielić troszkę inaczej. Jeżeli największa możliwa podana liczba to 9999, to musiałbyś zacząć dzielić przez 1000, 100, a następnie przez 10.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

No początkowo miałem taki zarys aby skracać wczytaną liczbę o jeden a następnie przypisywać ją do nowej zmiennej, ale pojawił się problem taki, że nie wiedziałem jak tworzyć automatycznie nową zmienną aby móc przypisywać jej kolejną wartość. Ten pomysł z tablicą kilka razy widziałem w internecie, ale byłem właśnie ciekawy czy jest jakiś inny sposób, który nie wybiegałby aż tak do przodu. A powiedz mi @Salvation dlaczego dzielić przez 1000, 100 a na końcu przez 10 w przypadku co podałeś wyżej? To nie jest przypadkiem dłuższy sposób tego co ja podałem w pierwszym poście i nie posiada ograniczenia w postaci określonej długości wczytanej liczby? Bo jeżeli liczba będzie wynosić 29 to raczej bez sensu dzielić przez 1000

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

Wybieganie do przodu? Nie bardzo rozumiem. Tablice, to bardzo przydatna rzecz w programowaniu.

Jeżeli zrobisz dzielenie przez 10, to spoko, też może być, ale będziesz musiał pamiętać, że otrzymaną kolejność z tego dzielenia będziesz musiał odwrócić, bo z liczby 29, otrzymasz 9, 2.

A nie! W tym problemie, to nawet odwracać nie będziesz musiał  nie wiem dlaczego pomyślałem o odwróceniu tablicy...

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

Z tym wybieganiem do przodu to chodziło mi o to, że w przypadku każdego kursu programowania tablice nie są na samym początku więc (nie ukrywając) byłem ciekaw czy istnieje inny sposób, który nie wymagałby użycia tablic. Oczywiście istnieje, ale jak wspomniałem wcześniej u mnie problem pojawia się w przypadku przypisywania kolejnych cyfr do nowej zmiennej, którą program sam musi utworzyć. 

Spróbuje z tą tablicą coś wykombinować i ew. wrócę tutaj męczyć dalej.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

Dobra, siedzę i czytam te informacje w internecie, ale nic z tego nie wychodzi. Zarówno w przypadku samych zmiennych jak i tablic (aby potem wykorzystać funkcję max()) muszę znać ilość cyfr w zapisie tej liczby, a nie mogę od razu określić z ilu elementów ma się składać. Myślałem by zrobić tak aby obliczyć ilość cyfr w liczbie a następnie utworzyć tablicę, która będzie zawierała X elementów (x = ilość cyfr w liczbie), ale co z tego jak funkcja max() potrzebuje określonej ilości argumentów, a ilość ta zależna jest tylko i wyłącznie od użytkownika więc nie mogę nałożyć stałej wielkości. 

A jakbym chciał tablicę intów to raczej nie mogę zrobić czegoś takiego:

int tab[ --cyfra ]; // --cyfra1 ponieważ w cout tak ją wywołuje i podaje mi poprawny wynik, czyli ilość cyfr w liczbie

Z drugiej strony nie do końca wiem jak przypisywać elementom tablicy poszczególne wartości...

Odnośnik do komentarza
Udostępnij na innych stronach

Nie musisz używać funkcji max - wystarczy posortować tablicę i wyświetlić zerowy (bądź ostatni element tablicy).

http://www.algorytm.org/algorytmy-sortowania/

20 minut temu, rogue napisał:

Z drugiej strony nie do końca wiem jak przypisywać elementom tablicy poszczególne wartości...

tab[0] = 1;

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Spoiler

#include <iostream>
#include <string>
using namespace std;

int main() {
  string num;

  cout << "Podaj liczbe: ";
  getline(cin, num); //liczbe zatwierdzasz enterem

  int len = num.length(); //dlugosc stringa
  int max = num[0]; //max = pierwsza cyfra liczby; niejawna konwersja na int, wynik w ASCII

  for(int i = 0; i < len; i++) {
    if(num[i] > max) { //jezeli podana cyfra jest wieksza od max, to...
      max = num[i]; //max = ta cyfra
    }
  }

  cout << max - 48; //max zawiera ASCII, wiec trzeba odjac 48; niejawna konwersja na string
}

 

Demo: http://cpp.sh/72nk2

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert

Wróciłem. Wprawdzie nie dotyczy to bezpośrednio problemu jaki był zawarty w pierwszym poście, ale zahacza o temat tablic.

Miałem napisać funkcję, która z liczby całkowitej zwraca pierwszą cyfrę. Wykorzystałem do tego pomysł jaki pojawił się wyżej i dokonałem konwersji inta na stringa po czym wyciągnąłem pierwszy znak uwzględniając oczywiście przypadek gdzie liczba jest ujemna. Wygląda to tak:

Spoiler

#include <iostream>
#include <sstream>
#include <cmath>
  
using namespace std;

int a;

int pierwszaCyfra(int a) {
  stringstream ss;
  string str;
  
  ss << a;
  ss >> str;
  cout << str[0];
}

int main() {
  cout << "Wprowadź liczbę całkowitą: ";
  cin >> a; // Wprowadzamy liczbę całkowitą
  a = abs(a); // Obliczamy jej wartość bezwzględną pozbywając się znaku "-"
  pierwszaCyfra(a); // Przechodzimy do funkcji return 0;
}

 

Tylko chciałbym aby ktoś łopatologicznie wytłumaczył mi działanie czterech linijek:

stringstream ss;
string str;
ss << a;
ss >> str;

O ile dwie ostatnie przypuszczam, że oznaczają dokładnie: Załaduj zmienną a do ss a następnie wypluj ss pod postacią stringa o nazwie str. Ale co z tymi dwiema pierwszymi, oznaczają stworzenie nowych zmiennych, opakowań.. czy jak to nazwać?

Odnośnik do komentarza
Udostępnij na innych stronach

Problem wciąż nierozwiązany? Dodaj swoją odpowiedź

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto. Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
 Udostępnij

×