Zamiana liczby na cyfry i wypisanie ostatniej liczby o pierwszej cyfrze parzystej

0

WItam,
Mam do napisania program ktory sposrod zakresu liczb wprowadzonego recznie wypisze ostatnia podana liczbe, której pierwsza cyfra zawiera liczbę parzystę, a w przypadku gdy żadna liczba nie zawiera pierwszej cyfry parzystej program wypisze, że nie ma takich liczb w ciagu.
Bardzo proszę o pomoc.

1

Rozumiem, że podawane są dwie liczby całkowite ab i szukamy największej liczby całkowitej z [a; b], której pierwsza cyfra jest parzysta?

Wczytujesz te dwie liczby, patrzysz czy pierwsza cyfra b jest parzysta. Jeśli jest, to zwracasz b. Jeśli nie, to zmniejszasz cyfrę wiodącą o jeden, uzupełniasz dziewiątkami, patrzysz czy jest co najmniej równa a. Jeśli jest, to zwracasz co uzyskałeś. Jeśli nie, to takiej liczby w zadanym zakresie nie ma.

0
Alfa napisał(a):

Bardzo proszę o pomoc.

Pomoc - czyli sam już coś zrobiłeś?

hasło do google na dziś sito Eratostenesa

0

Zacytuje zadanie: Dany jest ciąg liczb naturalnych a (bez 0). Napisac program który w ciągu a wyszuka ostatnią liczbę, której najbardziej znacząca cyfra jest parzysta, lub stwierdzi, że w ciągu nie ma elementu , którego najbardziej znacząca cyfra jest parzysta. Program musi umożliwić użytkownikowi wybrania jednego z dwoch sposobow generowania danych: a) podac wartosci elementow ciagu z klawiatury. b) wygenerowanie ciagu liczb o wartociach wylosowanych z zadanego przez uzytkownika zakresu. Program juz mam napisany zeby wygenerowal losowo i recznie, ale nie mam pojecia jak wyszukac tą liczbe. Czyli jezeli mamy liczby 147, 257, 86, 90 to program ma wypisac liczbe 86 , poniewaz wypisuje ostatnia podana liczbe ktora cyfra znaczaca ( zawsze pierwsza cyfra w liczbie - w tym przypadku 8) jest parzysta. Podobno while najelpiej to zrobic.

1
#include <iostream>

using namespace std;

int main() {
    int liczba;
    int znaczaca_cyfra;
    cout << "Podaj liczbę: ";
    cin >> liczba;

    while(liczba) {
        znaczaca_cyfra = liczba % 10;
        liczba /= 10;
    }
    cout << "Najbardziej znacząca cyfra tej liczby to: "
        << znaczaca_cyfra << endl;
}
0

A tu masz całe rozwiązanie na tablicy, chociaż ładniej by to wyglądało na wektorze:

 #include <iostream>
using namespace std;

int main() {
	int array[5]={147, 257, 86, 90};
	int znaczaca_cyfra, number;
	for (int i=sizeof(array)/sizeof(*array)-2; i>=0; i--){
		number = array[i];
  		while(number) {
    		 znaczaca_cyfra = number % 10;
        	number /= 10;
    	}
		cout<<array[i]<<"cyfra znaczaca to: "<<znaczaca_cyfra<<"\n";
	}
	return 0;
}
0

Wielkie dzieki.. Mam jeszcze problem z wyswietlenie liczby , której najbardziej znaczaca cyfra jest parzysta. Program który jest napisany wyświetla i sprawdza czy ostatnia liczba podana w ciagu ma cyfre znaczaca parzysta czy nie. Podam przyklad na czym mi zalezy. Podajemy np. 5 liczb ( 25,22,42,12,78) i w takim przypadku program ma wyswietlic liczbe 42, poniewaz szuka od konca podanego ciagu liczb , ktora liczba moze zawierac parzysta cyfre znaczaca( 42 bo 12 i 78 nie ma parzystej cyfry znaczacej) . Napisalem cos takiego. ale nie wiem jak wyszukac od konca ciagu liczby.
#include <iostream>
using namespace std;

int main() {
int a;
int znaczaca_cyfra,liczba_znaczaca;
cout << "Podaj ilosc liczb: ";
cin >> a;
int b[a];
for(int i=0; i<a; i++) {
cin>>b[i];
for(int j=a-1;j>=0;j--)
{
liczba_znaczaca=b[i];
}
while(b[i])
{ znaczaca_cyfra = b[i] % 10;
b[i] /= 10;
}}
if(znaczaca_cyfra%2==0)
cout << "Najbardziej znaczaca cyfra tej liczby to: "<<liczba_znaczaca;
else cout<<"Nie ma takiej liczby";
}

0

Nie napisalem calego polecenia. Program musi powinien umozliwic uzytkownikowi wybranie jednego z dwoch sposobow generowania danych a) podanie wartosci elementow ciagu z klawiatury b) wygenerowanie ciagu liczb o wartosciach wylosowanych z zadanego zakresu przez uzytkownika.
Nie masz wypisac ostatniej i rzapamietac, tylko musisz szukac w calym ciagu liczb gdzie znajduje sie parzysta cyfra znaczaca i w przypadku nie znalezienie wypisac ze nie ma takiej liczy.
Zadanie jest zle sformulowane ale wiem o czym mowie.

0

Ograniczyłem się wyłącznie do poprawy Twojego kodu. Jak pisałem, to nie jest rozwiązanie optymalne ale jest "minimalną zmianą" tego czegoś co napisałeś.

 #include <iostream>
#include <cstdlib>

using namespace std;

int main() {
    size_t ilosc_liczb; // Nazywaj zmienne z sensem.. 
    int znaczaca_cyfra;
    int liczba_znaczaca;
    cout << "Podaj ilosc liczb: ";
    cin >> ilosc_liczb;
    // Sprawdzenie czy poprawnie wprowadzono dane
    if(not cin) {
        cerr << "Wprowadziłeś jakieś bzdury. Nie będę się \"certolił\" i kończę\n";
        exit(EXIT_FAILURE);
    }
    //int b[a]; // <- NIE! To jest VLA i kompilatory wspierają to poza standardem C++
    int *tablica_liczb = new int[ilosc_liczb]; // Tak. To jest alokowanie pamięci ale wymaga na koniec sprzątania.
    // Wprowadzanie liczb
    for(size_t i = 0; i < ilosc_liczb; ++i) {
        cin >> tablica_liczb[i];
        if(not cin) {
            cerr << "Wprowadzone dane to nie liczba\n";
            exit(EXIT_FAILURE);
        }
    }
    // Wyszukiwanie liczby spełniającej kryteria
    liczba_znaczaca = -1; // Znacznik że nie została znaleziona
    for(size_t i = ilosc_liczb; i != 0; --i) {
        // Określenie najbardziej znaczącej cyfry
        int liczba = tablica_liczb[i - 1];
        while(liczba) {
            znaczaca_cyfra = liczba % 10;
            liczba /= 10;
        }
        // Test czy parzysta
        if((znaczaca_cyfra % 2) == 0) {
            liczba_znaczaca = tablica_liczb[i - 1];
            break;
        }
    }
    if(liczba_znaczaca == -1) {
        cout << "Nie ma takiej liczby\n";
    } else {
        cout << "Liczba spełniająca kryterium: " << liczba_znaczaca << '\n';
    }

    delete [] tablica_liczb; // To jest to sprzątanie.

    return EXIT_SUCCESS;
}
0

Można zdecydowanie ładniej to zrobić bez tablicy:

#include <iostream>
#include <string>
#include <optional>

int main() {
  int count;
  std::string tmp;
  std::optional<std::string> ret;

  std::cin >> count;

  while (count --> 0) {
    std::cin >> tmp;
    if (tmp[0] % 2) ret = tmp; // '0' (ASCII 48) jest parzyste, więc nie trzeba nawet zamieniać na cyfrę
  }

  std::cout << ret.value_or("Nie znaleziono") << '\n';
  return 0;
}

Można dodać sprawdzanie błędów, jednak założyłem (dla uproszczenia), że wejście zawsze będzie poprawne.

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