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.
Rozumiem, że podawane są dwie liczby całkowite a
i b
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.
Alfa napisał(a):
Bardzo proszę o pomoc.
Pomoc - czyli sam już coś zrobiłeś?
hasło do google na dziś sito Eratostenesa
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.
#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;
}
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;
}
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";
}
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.
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;
}
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.