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

Zadanie w C++ Nie wiem jak zacząć to zadanie

Object Storage Arubacloud
0 głosów
880 wizyt
pytanie zadane 25 sierpnia 2018 w C i C++ przez skos Nowicjusz (150 p.)
Napisz program, który wypisuje wszystkie liczby od 100 do 1 (malejąco),
które nie są podzielne przez 3.

6 odpowiedzi

+8 głosów
odpowiedź 25 sierpnia 2018 przez Knayder Nałogowiec (37,640 p.)
edycja 25 sierpnia 2018 przez Knayder
#include <iostream>
#include <tuple>

template<size_t... Is>
void print(std::index_sequence<Is...>) {
    ((std::cout << Is << ' '), ...);
}

template<size_t N, typename T>
struct seqMaker;

template<size_t N, size_t... Is>
struct seqMaker<N, std::index_sequence<Is...>> :
seqMaker<N-1u, 
std::conditional_t<N%3!=0, std::index_sequence<Is..., N>, std::index_sequence<Is...>> >{};  

template<size_t... Is>
struct seqMaker<0u, std::index_sequence<Is...>> {
    using seq = std::index_sequence<Is...>;
};


int main()
{
    print(typename seqMaker<100u, std::index_sequence<>>::seq{});

}

Pisane na szybko na telefonie.

komentarz 25 sierpnia 2018 przez Janix4000 Nowicjusz (100 p.)
Dzięki ziom, też właśnie ogarniałem to zadanko i w końcu udało mi się zejść poniżej tego 0.00000001s w wykonaniu tego zadania w run timie
komentarz 25 sierpnia 2018 przez Knayder Nałogowiec (37,640 p.)
Nie ma sprawy kumplu.
+8 głosów
odpowiedź 25 sierpnia 2018 przez Harry03 Początkujący (320 p.)
edycja 25 sierpnia 2018 przez Harry03
#include <iostream>
#include <utility>

template <size_t Value>
constexpr bool Condition()
{
	return Value % 3 != 0;
}

template <auto...>
struct ValuePack;

template <size_t, typename...>
struct NumSeq;

template <size_t V, size_t... Is>
struct NumSeq<V, ValuePack<Is...>> : NumSeq<V - 1, std::conditional_t<Condition<V>(), ValuePack<Is..., V>, ValuePack<Is...>>>
{ };

template <size_t... Is>
struct NumSeq<0, ValuePack<Is...>> : std::index_sequence<Is...> 
{ };

template<size_t... Is>
void Print(std::index_sequence<Is...>)
{
	((std::cout << Is << " "), ...);
}

int main()
{
	Print(NumSeq<100u, ValuePack<>>{});
}

 

+5 głosów
odpowiedź 25 sierpnia 2018 przez Wektor Początkujący (260 p.)

Kilku panów to widzę dało widzę pobieżne odpowiedzi więc przygotowałem coś co faktycznie ci się do czegoś przyda.
Jak widzisz w tej implementacji w łatwy sposób możesz również zmienić kierunek liczb, wartości i dzielnik który ma zostać wyłączony. Mam nadzieję, że uznasz tą odpowiedź za wystarczającą. Przepraszam, iż to rozwiązanie jest takie trywialne ale wydajesz być się początkującym programistą więc nie chciałem cię przytłaczać nadmiarem informacji. Gdybyś miał pytania to pisz śmiało : )
 

#include <iostream>
#include <utility>

namespace Impl
{
	template<size_t start, size_t end, size_t offset, size_t divide_exclude, size_t result, size_t... seq>
	struct num_list
		: num_list<start + offset, end, offset, divide_exclude, (start + offset) % divide_exclude, seq..., start> {};

	template<size_t start, size_t end, size_t offset, size_t divide_exclude, size_t... seq>
	struct num_list<start, end, offset, divide_exclude, 0u, seq...>
		: num_list<start + offset, end, offset, divide_exclude, (start + offset) % divide_exclude, seq...> {};

	template<size_t end, size_t offset, size_t divide_exclude, size_t result, size_t... seq>
	struct num_list<end, end, offset, divide_exclude, result, seq...>
		: std::index_sequence<seq..., end> {};

	template<size_t end, size_t offset, size_t divide_exclude, size_t... seq>
	struct num_list<end, end, offset, divide_exclude, 0u, seq...>
		: std::index_sequence<seq...> {};
}
template<size_t start, size_t end, size_t offset, size_t divide_exclude>
struct num_list : Impl::num_list<start, end, offset, divide_exclude, start % divide_exclude>{
	static_assert(divide_exclude != 0u);
};


template<typename I, I...Is>
void print_sequence(std::integer_sequence<I, Is...>){
	((std::cout << Is << " "), ...);
}


int main()
{
	constexpr int start = 100;
	constexpr int end   = 0;
	constexpr int delta = -1;
	constexpr int divid = 0;

	print_sequence(num_list<start, end, delta, divid>{});
}

 

+2 głosów
odpowiedź 25 sierpnia 2018 przez Velta Maniak (52,010 p.)
edycja 25 sierpnia 2018 przez Velta
W każdej iteracji sprawdzasz, czy zmienna w pętli jest podzielna przez 3 (lub czy nie jest). Jeżeli spełni warunek – wypisz ją.
komentarz 25 sierpnia 2018 przez RafalS VIP (122,820 p.)
Za co minusy :D? Przecież takiej odpowiedzi oczekiwał autor. Nie szablonowych compile-time sztuczek :D
+2 głosów
odpowiedź 26 sierpnia 2018 przez manjaro Nałogowiec (37,390 p.)
edycja 26 sierpnia 2018 przez manjaro

Łap najprościej napisany jak się dało i bez niepotrzebnej złożoności obliczeniowej na sprawdzanie warunków.

Ten jest najłatwiejszy

#include <iostream>
using namespace std;

int main()
{   
    for (auto i=100;i>0;i-=1) {
        if (i%3!=0) cout << i << " ";
    }
    return 0;
}

A tutaj masz inny z najmniejszą złożonością obliczeniową

#include <iostream>
using namespace std;

int main()
{
    cout << 100 << " ";
    for (int i=98;i>0;i-=3) {
        cout << i << " ";
        cout << i-1 << " ";
    }

    return 0;
}

 

–1 głos
odpowiedź 26 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)
%:include <iostream>
%:include <ciso646>

bool show_not_divided_by(int div, int val) <%
    return val and ((val % div) and std::cout << val << '\n', show_not_divided_by(div, --val));
%>

int main() <% show_not_divided_by(3, 100); %>

Tak.. pewnie na makrach było by czytelniejsze... :)

komentarz 26 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Co to za język?
komentarz 26 sierpnia 2018 przez niezalogowany

Hiskiel C++ z dwuznakami :D

komentarz 26 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Po co te dwuznaki?
komentarz 26 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)
Po co dwuznaki? Proste... bo można a i ktoś zapyta czy to nie jest język definicji szablonów HTML. A jak robi się tak niepoważnie to dlaczego nie?

A poważniej, nagłówek iso646 definiuje normalne nazwy dla operatorów && i || oprócz tej 2-znakowej magii.
komentarz 26 sierpnia 2018 przez monika90 Pasjonat (22,940 p.)

ciso646 będzie usunięty ze standardowego C++, a and, or, not itp. to były słowa kluczowe już w C++98.

komentarz 26 sierpnia 2018 przez monika90 Pasjonat (22,940 p.)

@Hiskiel, nie wszyscy mogą używać zestawu znaków albo klawiatury, która ma { czy #, nieszczęśnicy ci zmuszeni są używać dwuznaków.

komentarz 26 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Dobrze, dziękuję za wyjaśnienie. A trójznaki po co? Dla osób które nie mają znaków potrzebnych do dwuznaków, czy jak?
komentarz 26 sierpnia 2018 przez monika90 Pasjonat (22,940 p.)
trójznaki były pierwsze (a w C++17 już ich nie ma), dwuznaki i alternatywne tokeny (compl, xor, itp.) pojawiły się później, są trochę bardziej czytelne.
komentarz 26 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)

@monika90, VS ma problem z operatorami and/or itp... dopiero po włączeniu nagłówka zachowuje się poprawnie.... Oczywiście reszta znanych kompilatorów, zachowuje się normalnie :) Można ponoć walczyć z tym w VS jakimiś przełącznikami. Problemu nie drążyłem składając go na "i znów MS ustosunkował się do standardu jak umiał i chciał"...

Jeśli sprowokowałem przez przypadek dyskusję o dwuznakach to informuję że na szczęście nie zdarzyło mi się być zmuszonym do ich użycia produkcyjnie. Warto wiedzieć jednak że istnieją oraz to że "trigraphs" dalej są w C (i na szczęście z C++ 2017 już je usunięto przy "społecznych protestach korporacji" :-) )

Podobne pytania

+1 głos
1 odpowiedź 233 wizyt
0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 2 kwietnia 2018 w C# przez Luti Nowicjusz (120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...