• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

cpp zadanie liczby

Object Storage Arubacloud
+1 głos
1,016 wizyt
pytanie zadane 6 maja 2021 w C i C++ przez fsfxvcxv Obywatel (1,160 p.)
#include <iostream>
using namespace std;

int main()
{
	int ile = 0; 
for(int i=100;i<=999;i++)
{
    if(i!=i+1 && i!=i+2 && i+1!=i+2)
        cout<<i<<" ";
    ile++;
}
    cout<<ile<<endl;
	return 0;
}

Witam. Zadanie to: napisz program, który wyświetli wszystkie liczby trzycyfrowe o niepowtarzających się cyfrach oraz określi ilość takich liczb.

I mam pytanie dlaczego program po prostu wyswietla wszystkie liczby i co tutaj jest zle ? 

komentarz 6 maja 2021 przez Oscar Nałogowiec (29,290 p.)
    if(i!=i+1 && i!=i+2 && i+1!=i+2)

Taki warunek jest tożsamościomo prawdziwy, nie dostajesz komunikatu od kompilatora?

Oczywiście dostępu do pojedynczych cyfr tak nie otrzymasz - pamiętaj, że komputer działa w systemie dwójkowym i pojęcie "cyfry" w ludzkim (dziesiętnym) znaczeniu jest mu obce. Widzę dwa w miare proste sposobu

  1.  Tak jak zrobiłeś pętla od 100 do 999 i zamiany liczby (i) na cyfry (modulo itp).
  2.  Trzy zagnieżdzone pętle, każda dla konkretnej pozycji cyfry w liczbie. Jedna od 1 do 9 (albo '1' do '9'), pozostałe analogicznie od 0 do 9. Potem reszta jest prosta. Pamiętaj, że nie musisz działać na pojedynczej wartości liczbowej, możesz wypisac wynik jako 3 oddzielne znaki, tylko wypisane kolejno bez odstępów.
komentarz 6 maja 2021 przez fsfxvcxv Obywatel (1,160 p.)
co oznacza, że ,,Taki warunek jest tożsamościomo prawdziwy"
1
komentarz 6 maja 2021 przez adrian17 Ekspert (344,860 p.)
każda liczba zawsze z definicji jest różna od liczby o 1 większej. Więc `i` zawsze jest różne od `i+1`, więc wyrażenie `if( i!=i+1` jest zawsze prawdziwe.

2 odpowiedzi

0 głosów
odpowiedź 7 maja 2021 przez VBService Ekspert (253,340 p.)
edycja 8 maja 2021 przez VBService

Propozycja:  wink

on-line

#include <iostream>
using namespace std;
 
int main()
{
    unsigned ile=0; 
    for (auto i=100; i<1000; ++i)
    {
        string n = to_string(i);
        if (n[0]==n[1] || n[0]==n[2] || n[1]==n[2]) continue;
        
        cout << i << " ";
        if (++ile%20 == 0) cout << endl; 
    }
    
    cout << endl << "Ilosc liczb: " << ile;
    return 0;
}

 

Propozycja według wskazówek @Oscar-a

on-line

#include <iostream>
using namespace std;
 
int main()
{
    unsigned ile=0; 
    for (auto i=1; i<10; ++i)
    {
        for (auto j=0; j<10; ++j)
        {
            for (auto k=0; k<10; ++k)
            {
                if (i==j || i==k || j==k) continue;
                    
                cout << i << j << k << " ";
                if (++ile%20 == 0) cout << endl;
            }
        }
    }
    
    cout << endl << "Ilosc liczb: " << ile;
    return 0;
}eturn 0;
}

 

0 głosów
odpowiedź 7 maja 2021 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <cassert>

bool is_different_digits(int value) {
	assert(value >= 100 and value < 1000);
	auto v1 = value % 10;
	auto v2 = (value / 10) % 10;
	auto v3 = (value / 100) % 10;
	return (v1 != v2) and (v2 != v3) and (v3 != v1);
}

int main() {
	unsigned count = 0;
	for(auto i = 100; i < 1000; ++i) {
		if (is_different_digits(i)) {
			std::cout << i << '\n';
			++count;
		}
	}
	std::cout << "Liczb 3 cyfrowych których cyfry się różnią, jest w przedziale [100,100): " << count <<'\n';
}

 

#include <iostream>
#include <cassert>

bool is_different_digits(int value) {
	assert(value >= 100 and value < 1000);
	auto v1 = value % 10;
	auto v2 = (value / 10) % 10;
	auto v3 = (value / 100) % 10;
	return (v1 != v2) and (v2 != v3) and (v3 != v1);
}

int main() {
	unsigned count = 0;
	for(auto i = 100; i < 1000; is_different_digits(i) and (std::cout << i << '\n', ++count), ++i);
	std::cout << "Liczb 3 cyfrowych których cyfry się różnią, jest w przedziale [100,100): " << count <<'\n';
}

 

#include <string>
#include <iostream>
#include <unordered_set>

bool is_different_digits(unsigned value) {
	auto value_str = std::to_string(value);
	auto value_set = std::unordered_set<char>(value_str.cbegin(), value_str.cend());
	return value_str.size() == value_set.size();
}

int main() {
	auto count = 0;
	for(auto i = 100U; i < 1000; ++i) {
		if(is_different_digits(i)) {
			std::cout << i << '\n';
			++count;
		}
	}
	std::cout << "Liczb 3 cyfrowych których cyfry się różnią, jest w przedziale [100,100): " << count <<'\n';
}

 

#include <string>
#include <iostream>
#include <unordered_set>
#include <array>
#include <numeric>
#include <algorithm>
#include <iterator>

bool is_different_digits(unsigned value) {
	auto value_str = std::to_string(value);
	auto value_set = std::unordered_set<char>(value_str.cbegin(), value_str.cend());
	return value_str.size() == value_set.size();
}

int main() {
	std::array<unsigned, 1000 - 100> values;
	std::iota(values.begin(), values.end(), 100);
	auto count = std::count_if(values.cbegin(), values.cend(), is_different_digits);
	std::copy_if(values.cbegin(), values.cend(), std::ostream_iterator<unsigned>(std::cout, "\n"), is_different_digits);
	std::cout << "Liczb 3 cyfrowych których cyfry się różnią, jest w przedziale [100,100): " << count <<'\n';
}

i tak do ranges, generatorów itp.. Nie wszystkie są wydajne ale starałem się by nie były (bardzo) typowe.

Podobne pytania

0 głosów
2 odpowiedzi 787 wizyt
pytanie zadane 22 listopada 2016 w C i C++ przez dudu2002 Początkujący (330 p.)
0 głosów
0 odpowiedzi 186 wizyt
pytanie zadane 19 września 2021 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
2 odpowiedzi 616 wizyt
pytanie zadane 13 lipca 2019 w C i C++ przez Padomen Początkujący (260 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...