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źć.
[C++] Wariacje dwuelementowe.
- Althorion
- 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.
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)
}
}
-
- Użytkownik
- Posty: 40
- Rejestracja: 25 lis 2012, o 10:06
- Płeć: Mężczyzna
- Lokalizacja: Polska
- Podziękował: 1 raz
[C++] Wariacje dwuelementowe.
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:
Ale nie działa (bardzo długo liczy i nie może się doliczyć tych par).
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;
}
- Althorion
- 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.
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
Po drugie, jaka jest idea samej funkcji
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)”.
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)”.
-
- Użytkownik
- Posty: 40
- Rejestracja: 25 lis 2012, o 10:06
- Płeć: Mężczyzna
- Lokalizacja: Polska
- Podziękował: 1 raz
[C++] Wariacje dwuelementowe.
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.
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.
- Althorion
- 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.
No jakaś idea to jest, może nawet najprostsza, trudno powiedzieć nie znając badanej funkcji.
Szkielet kodu wyglądałby więc tak:
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;
}
}
}