[C++] Wariacje dwuelementowe.

sardom
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 25 lis 2012, o 10:06
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 1 raz

[C++] Wariacje dwuelementowe.

Post autor: sardom »

Czy istnieje jakiś łatwy algorytm wypisujący mi dla zadanego \(\displaystyle{ n \in \mathbb{N}}\) wszystkie wariacje dwuelementowe, np. dla \(\displaystyle{ n = 3}\) byłyby to takie pary:

\(\displaystyle{ (1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)}\)

Chciałbym to zrobić tak. Mam dwie zmienne np, \(\displaystyle{ i=1, k=1}\), najpierw przy stałym \(\displaystyle{ k=1}\), \(\displaystyle{ i}\) zmienia \(\displaystyle{ 1}\) do \(\displaystyle{ n}\), gdy osiągnie wartość \(\displaystyle{ n}\), program zwiększa \(\displaystyle{ k}\) o 1, a \(\displaystyle{ i}\) ustawia z powrotem na \(\displaystyle{ 1}\), i pętla znów się powtarza aż do momentu osiągnięcia przez \(\displaystyle{ k}\) wartości \(\displaystyle{ n}\).
Jakoś nie mogę tego rozgryźć.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Wariacje dwuelementowe.

Post autor: Althorion »

Zagnieżdżone pętle:

Kod: Zaznacz cały

int n = 3;
for (int k = 1; k <= n; ++k) {
    for (int i = 1; i <= n; ++i) {
        // (k, i)
    }
}
sardom
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 25 lis 2012, o 10:06
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 1 raz

[C++] Wariacje dwuelementowe.

Post autor: sardom »

Dzięki za szybką odpowiedź.
Jeszcze jedno pytanie, w którym miejscu mógłbym umieścić warunek,
(powiedzmy że napisałem funkcję rownosc(a,b), która sprawdza, czy te liczby są równe), czy rownosc(i,k) jest spełnione.
Jeśli tak, to powiedzmy zwiększa mi jakąś stworzoną przeze mnie zmienną o jeden i w ten sposób zliczam ile mam takich samych par (w tym przypadku podwójnie).


Mój kod wgląda tak:

Kod: Zaznacz cały

{
  int licznosc = 0;
  for(int i = 1; i <= n; ++i)
  {
    for(int j = 1; j <= n; ++j)
      {
        while (rownosc(i,j) == 0) // w programie badam różnicę liczb
        ++licznosc;
      }
  }return licznosc;
}

Ale nie działa (bardzo długo liczy i nie może się doliczyć tych par).
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Wariacje dwuelementowe.

Post autor: Althorion »

Nie dziwi mnie to specjalnie. Co chciałeś osiągnąć w siódmej linijce? Bo na razie masz tam pętlę, która będzie się wykonywać tak długo, jak tylko rownosc(i, j) będzie zwracać 0. Czyli, jeśli funkcja ta jest deterministyczna (czyli zawsze dla takich samych danych wejściowych da ten sam wynik), albo nie wykona się ani razu, albo będzie się wykonywać w nieskończoność, zawieszając program.

Po drugie, jaka jest idea samej funkcji rownosc? Liczby możesz porównać po prostu a == b.

Po trzecie, w przyszłości postaraj się pisać więcej o wyniku, bo „nie działa” można interpretować na wiele sposobów — chociażby jako „nie kompiluje się”, „zawiesza przy wykonywaniu” a czasem wręcz jako „robi co innego niż bym chciał(a)”.
sardom
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 25 lis 2012, o 10:06
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 1 raz

[C++] Wariacje dwuelementowe.

Post autor: sardom »

Idea jest taka:
Mam (jakąkolwiek) funkcję zależną od dwóch zmiennych, chciałbym policzyć moc jej przeciwobrazu przez jakiś singleton (tzn. te argumenty, dla których funkcja przyjmuje np. wartość 0).
Wymyśliłem, że muszę "przeglądnąć" po kolei każdą parę argumentów, i jeśli dla którychś funkcja przyjmie wartość 0, to naliczam jakąś zmienną i na końcu, gdy będę miał wartość tej zmiennej będę znał moc przeciwobrazu funkcji.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Wariacje dwuelementowe.

Post autor: Althorion »

No jakaś idea to jest, może nawet najprostsza, trudno powiedzieć nie znając badanej funkcji.

Szkielet kodu wyglądałby więc tak:

Kod: Zaznacz cały

int funkcja(int a, int b);

unsigned int liczbaMiejscZerowych = 0;
const int limitDolny = (ileśtam);
const int limitGorny = (ileśtam);

for (int i = limitDolny; i <= limitGorny; ++i) {
  for (int j = limitDolny; j <= limitGorny; ++j) {
    if (0 == funkcja(i, j)) {
      ++liczbaMiejscZerowych;
    }
  }
}
ODPOWIEDZ