Strona 1 z 1
[C++] Wariacje dwuelementowe.
: 14 kwie 2015, o 16:40
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źć.
[C++] Wariacje dwuelementowe.
: 14 kwie 2015, o 16:51
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)
}
}
[C++] Wariacje dwuelementowe.
: 14 kwie 2015, o 17:10
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).
[C++] Wariacje dwuelementowe.
: 14 kwie 2015, o 17:26
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)”.
[C++] Wariacje dwuelementowe.
: 14 kwie 2015, o 21:28
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.
[C++] Wariacje dwuelementowe.
: 14 kwie 2015, o 21:45
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;
}
}
}