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

Pokazywanie liczby jako sumy innych

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
467 wizyt
pytanie zadane 25 maja 2022 w C i C++ przez Franciszek Nowicjusz (130 p.)
edycja 29 maja 2022 przez Franciszek
Witam mam problem z jednym zadaniem w którym trzeba wyznaczyć liczbę jako sumę innych, jednakże za Chiny nie jestem w stanie dojść jak to zrobić. Tu jest treść zadania:

Z góry serdecznie dziękuję!

1 odpowiedź

+3 głosów
odpowiedź 26 maja 2022 przez Great Stary wyjadacz (12,660 p.)
edycja 26 maja 2022 przez Great

Ciąg znaków posiada 10 elementów. Pomiędzy nimi może wystąpić maksymalnie 9 połączeń tak, aby utworzyły jakaś liczbę. Możesz zadeklarować 9-elementową tablicę, której wartości będą przedstawiać rodzaj połączenia:

  • 0 dla {8, 9} -> 89
  • 1 dla {8, 9} -> 8 + 9
  • 2 dla {8, 9} -> 8 - 9

Dla połączeń | 0 1 0 1 0 0 2 0 0  | otrzymamy: 12+34+567-890

Teraz wygenerujmy wszystkie możliwe kombinacje z powtórzeniami:

bool next_combination(std::vector<int>& vec, int max) {
	for (auto& value : vec) {
		if (++value <= max) {
			return true;
		}
		value = 0;
	}
	return false;
}

Przykład wypisania wszystkich możliwych ciągów do przeliczenia:

#include <iostream>
#include <string>
#include <vector>

bool next_combination(std::vector<int>& vec, int max) {
	for (auto& value : vec) {
		if (++value <= max) {
			return true;
		}
		value = 0;
	}
	return false;
}

void print_vec(std::vector<int> const& ints) {
    std::cout << "| ";
    for (auto i : ints)
        std::cout << i << " ";
    std::cout << " |\n";
}

void print_expr(std::string const& pattern, std::vector<int> const& connections) {
    std::cout << pattern.front();
    for (std::size_t i = 0; i < connections.size(); ++i) {
        if (connections[i] != 0) {
            std::cout << (connections[i] == 1 ? '+' : '-');
        }
        std::cout << pattern[i + 1];
    }
    std::cout << "\n";
}

int main() {
    std::string pattern = "1234567890"; // std::vector<int> 
    std::vector<int> connections(pattern.size() - 1);

    do {
        print_expr(pattern, connections);
        print_vec(connections);
    } while (next_combination(connections, 2));
}

Następnie oblicz wszystkich powstałe wyrażenia i porównuj wyniki z liczbą podaną na wejściu.

komentarz 27 maja 2022 przez Franciszek Nowicjusz (130 p.)
Jak zrobić żeby program faktycznie dokonywał obliczeń na podanej tablicy i żeby cyfry w tym ciągu pokazywały konkretny wynik?
1
komentarz 27 maja 2022 przez Great Stary wyjadacz (12,660 p.)

Utwórz zwykłą pętlę po wszystkich połączeniach. Kolejne cyfry ciągu połącz w liczbę (liczba = liczba * 10 + cyfra). Jeżeli liczbę poprzedzał znak +/- dodaj/odejmij ją od wyniku. Bardzo prosta metoda jedna pętla, jedna instrukcja warunkowa, dodawanie, odejmowanie, mnożenie.

PS Masz literówkę w zadaniu: 12+34+567-890=-277.

komentarz 28 maja 2022 przez Franciszek Nowicjusz (130 p.)
Bardzo Cię przepraszam, ale jestem chyba trochę nieogarnięty:) Mam zadeklarować nową zmienną liczba? Bo w tym programie pattern tych liczb to zmienna typu string. W ogóle dzięki Ci bardzo za Twój poświęcony czas.

Podobne pytania

0 głosów
1 odpowiedź 919 wizyt
0 głosów
2 odpowiedzi 431 wizyt
pytanie zadane 26 stycznia 2022 w C i C++ przez maxkolanko1998 Gaduła (3,230 p.)
0 głosów
0 odpowiedzi 158 wizyt
pytanie zadane 26 marca 2021 w Algorytmy przez rob5016 Nowicjusz (120 p.)

93,436 zapytań

142,431 odpowiedzi

322,669 komentarzy

62,801 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

...