[C++] Ile jest różnych liczb w tablicy
-
- Użytkownik
- Posty: 874
- Rejestracja: 4 paź 2010, o 08:16
- Płeć: Mężczyzna
- Lokalizacja: wszedzie
- Podziękował: 248 razy
- Pomógł: 10 razy
[C++] Ile jest różnych liczb w tablicy
Jak zliczyć ile jest różnych liczb w tablicy?
Ostatnio zmieniony 25 mar 2012, o 14:04 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
-
- Użytkownik
- Posty: 311
- Rejestracja: 30 gru 2011, o 02:21
- Płeć: Mężczyzna
- Lokalizacja: Puławy
- Podziękował: 11 razy
- Pomógł: 53 razy
[C++] Ile jest różnych liczb w tablicy
To zależy jaki masz przedział. Jeżeli liczby są z dużego przedziału to musisz użyć mapy/hashmapy.
Możesz ewentualnie przesortować tablice i raz przejechać się po niej dodając do wyniku jeden gdy masz zmiane wartości np:
Jeżeli liczby są z niewielkiego przedziału możesz użyć dodatkowej tablicy booli(początkowo wyzerowanej). W każdym przebiegu pętli masz takie coś:
Czyli jeżeli wartość pola tab jest równa \(\displaystyle{ 0}\) to w tablicy mamy wystąpienie nowej wartości.
Możesz ewentualnie przesortować tablice i raz przejechać się po niej dodając do wyniku jeden gdy masz zmiane wartości np:
Kod: Zaznacz cały
tab[i]!=tab[i+1]; ++wynik;
Kod: Zaznacz cały
if(tabbool[tab[i]] != 1){++wynik; tabbool[tab[i]]=1;}
Ostatnio zmieniony 23 mar 2012, o 18:27 przez gryxon, łącznie zmieniany 2 razy.
-
- Użytkownik
- Posty: 75
- Rejestracja: 6 maja 2010, o 18:05
- Płeć: Mężczyzna
- Podziękował: 16 razy
- Pomógł: 6 razy
[C++] Ile jest różnych liczb w tablicy
Różnych elementów, czyli że jeśli mamy załóżmy tablicę 10 elementową i jest w niej 6 czwórek, tzn. że liczba niepowtarzających się elementów jest 4 (nazywam to pierwszym przypadkiem), czy po prostu mamy wyeliminować powtórzenia tej liczby (drugi przypadek)?
Algorytm dla pierwszego przypadku
1. Zmiennej x przypisz ogólną liczbę elementów tablicy
2. int l=0 (licznik obrotów pętli, będzie wskazywać nam, który element w tablicy jest analizowany)
3. Przesortuj tablicę rosnąco
4. int p=0 (całkowita liczba powtórzeń)
5. dla l<x
Algorytm dla drugiego przypadku (eliminacja powtórzeń liczby już występującej)
1. Zmiennej x przypisz ogólną liczbę elementów tablicy
2. int l=0 (licznik obrotów pętli, będzie wskazywać nam, który element w tablicy jest analizowany)
3. Przesortuj tablicę rosnąco
4. int p=0 (całkowita liczba powtórzeń)
5. dla l<x
Jeśli będziesz miał problem z zapisem całego kodu, daj znać.
[EDIT]
Czyli jak to ujął krótko gryxon, w moim sposobie chodzi o przesortowanie tablicy, potem sprawdzanie każdego niepowtarzającego się wcześniej elementu czy pojawia się w dalszych elementach tablicy, jeśli tak to dodajesz 1 do liczby powtórzeń. Całkowita liczba niepowtarzających się elementów będzie równa różnicy pomiędzy ilością wszystkich elementów tablicy, a liczbą elementów powtarzających się.
Algorytm dla pierwszego przypadku
1. Zmiennej x przypisz ogólną liczbę elementów tablicy
2. int l=0 (licznik obrotów pętli, będzie wskazywać nam, który element w tablicy jest analizowany)
3. Przesortuj tablicę rosnąco
4. int p=0 (całkowita liczba powtórzeń)
5. dla l<x
- int z=0 (przechowuje informację ile razy dana liczba się powtórzyła)
- int k=l+1 (na potrzeby pętli)
- for (;k<x;k++)
Kod: Zaznacz cały
{
if (tab[l]==tab[k]) z++;
}
- l=l+z+1 (licznik przechodzi na kolejny różny element)
- if (z!=0) p=p+z+1;
Algorytm dla drugiego przypadku (eliminacja powtórzeń liczby już występującej)
1. Zmiennej x przypisz ogólną liczbę elementów tablicy
2. int l=0 (licznik obrotów pętli, będzie wskazywać nam, który element w tablicy jest analizowany)
3. Przesortuj tablicę rosnąco
4. int p=0 (całkowita liczba powtórzeń)
5. dla l<x
- int z=0 (przechowuje informację ile razy dana liczba się powtórzyła)
- int k=l+1 (na potrzeby pętli)
- for (;k<x;k++)
Kod: Zaznacz cały
{
if (tab[l]==tab[k]) z++;
}
- l=l+z+1 (licznik przechodzi na kolejny różny element)
- if (z!=0) p=p+z;
Jeśli będziesz miał problem z zapisem całego kodu, daj znać.
[EDIT]
Czyli jak to ujął krótko gryxon, w moim sposobie chodzi o przesortowanie tablicy, potem sprawdzanie każdego niepowtarzającego się wcześniej elementu czy pojawia się w dalszych elementach tablicy, jeśli tak to dodajesz 1 do liczby powtórzeń. Całkowita liczba niepowtarzających się elementów będzie równa różnicy pomiędzy ilością wszystkich elementów tablicy, a liczbą elementów powtarzających się.
-
- Użytkownik
- Posty: 874
- Rejestracja: 4 paź 2010, o 08:16
- Płeć: Mężczyzna
- Lokalizacja: wszedzie
- Podziękował: 248 razy
- Pomógł: 10 razy
[C++] Ile jest różnych liczb w tablicy
dzieki mam pytanie : mając dana tablice z parzystą liczbą elementów i chciałbym z niej wyjąć do drugiej tabeli tylko elementy o indeksach parzystych, jak to zrobic?
-
- Użytkownik
- Posty: 75
- Rejestracja: 6 maja 2010, o 18:05
- Płeć: Mężczyzna
- Podziękował: 16 razy
- Pomógł: 6 razy
[C++] Ile jest różnych liczb w tablicy
Utworzyłbym nową tablicę o rozmiarze równym połowie rozmiarowi poprzedniej, jeśli ilość elementów była parzysta, jeśli nie, to całość z połowy poprzedniej + 1.
Załóżmy, że ta nowa tablica to parzyste[], a poprzednia calosc[d] (d - ilość elementów)
Wtedy tworzymy pętlę
Załóżmy, że ta nowa tablica to parzyste[], a poprzednia calosc[d] (d - ilość elementów)
Wtedy tworzymy pętlę
Kod: Zaznacz cały
int p=d/2 (dla parzystych)
int p=d/2 + 1 (dla nieparzystych)
int indeks=0;
for (int x=0; x<p; x++)
{
parzyste[x]=calosc[indeks];
indeks=indeks+2;
}
-
- Użytkownik
- Posty: 75
- Rejestracja: 6 maja 2010, o 18:05
- Płeć: Mężczyzna
- Podziękował: 16 razy
- Pomógł: 6 razy
[C++] Ile jest różnych liczb w tablicy
Kod: Zaznacz cały
int p=d/2;
int indeks=1;
for (int x=0; x<p; x++)
{
parzyste[x]=calosc[indeks];
indeks=indeks+2;
}
-
- Użytkownik
- Posty: 874
- Rejestracja: 4 paź 2010, o 08:16
- Płeć: Mężczyzna
- Lokalizacja: wszedzie
- Podziękował: 248 razy
- Pomógł: 10 razy
[C++] Ile jest różnych liczb w tablicy
jakoś z nie parzystymi mi nie wychodzi , dla parzystych ten program działa
Kod: Zaznacz cały
#include <iostream>
using namespace std;
int main()
{
int N;
int j=0;
cin >> N;
int tab[2*N];
int t[N];
int i;
for(i=0;i<2*N;i++) cin>>tab[i];
for(i=0;i<2*N;i++)
{t[i]=tab[j];
j=j+2;}
for(j=0;j<N;j++)
cout<<t[j]<<endl;
return 0;
}
-
- Użytkownik
- Posty: 75
- Rejestracja: 6 maja 2010, o 18:05
- Płeć: Mężczyzna
- Podziękował: 16 razy
- Pomógł: 6 razy
[C++] Ile jest różnych liczb w tablicy
Już sprawdzam co jest grane, ale pierwsze co zauważyłem, to stosujesz tablice statyczne w przypadku kiedy użytkownik sam podaje rozmiar tablicy. W takich przypadkach należy posłużyć się tablicą dynamiczną, ponieważ taki kod już z zasady nie przejdzie podczas kompilacji np. w MS Visual C++ 2010 Express.
Dodatkowo brak funkcji zatrzymującej okno konsoli, co uniemożliwia odczyt wyników pracy.
Daj przed return 0;
[EDIT]
najpierw dałeś
a następnie
j zatem ma wskazywać na indeksy nieparzyste z tego co rozumiem. Błąd jest w deklaracji, ponieważ pierwszym indeksem nieparzystym jest 1, nie zero, zatem
i już powinno wszystko grać.
Dodatkowo brak funkcji zatrzymującej okno konsoli, co uniemożliwia odczyt wyników pracy.
Daj przed return 0;
Kod: Zaznacz cały
cin.ignore();
getchar();
[EDIT]
najpierw dałeś
Kod: Zaznacz cały
int j=0;
Kod: Zaznacz cały
for(i=0;i<2*N;i++)
{
t[i]=tab[j];
j=j+2;
}
Kod: Zaznacz cały
int j=1;
Ostatnio zmieniony 23 mar 2012, o 19:54 przez iglomosh, łącznie zmieniany 2 razy.
-
- Użytkownik
- Posty: 75
- Rejestracja: 6 maja 2010, o 18:05
- Płeć: Mężczyzna
- Podziękował: 16 razy
- Pomógł: 6 razy
[C++] Ile jest różnych liczb w tablicy
Sprawdziłem poprawiony kod (z j=1), działa bez zarzutu.
(Jakbyś nie zauważył to dałem edycję w poście wyżej, masz tam wyjaśnione, gdzie i jaki masz błąd)
EDIT
Służę pomocą
(Jakbyś nie zauważył to dałem edycję w poście wyżej, masz tam wyjaśnione, gdzie i jaki masz błąd)
EDIT
Służę pomocą