[c++]wyświetlenie powt. się liczb, rosnąco

0

dzień dobry,
używam dev c++.
Otóż mam do napisania program który liczy powtórzone cyfry sprawdza które powtórzyły się co najmniej dwa razy i wypisuje je na ekranie. Jeszcze jest pierwsza liczba która określa ile kolejnych zostanie wprowadzone.np.7
1,3,8,3,1,3,1004 powinno wyświetlić 1,3
Mój sposób to porównanie każdej z każda, przy wskazniku na int i for, zapisanie ile było powtórzeń dla niepowtarzających się cyferek, posortowaniu rosnąco i koniec. Ale wychodzą mi naprawdę długie linijki skomplikowanego kodu, może ktoś by mi podsunął pomysł jak zrobić to sposobem, a nie pod górkę jak nieudolnie próbuje... pozdrawiam

0

Posortować.

0

Audi multa, loquere pauca :) ale mógł byś napisać np. w jakim celu i miejscu użyć ? czy odpowiednia będzie qsort(), czy inna ?

0

Można sortować bele czym, ważne żeby było posortowane jak chcesz. Przykład w czystym C:

#include <stdio.h>
#include <stdlib.h>

int cmpfn(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}

int main(int argc, char** argv) {
    int t[] = {1,3,8,3,1,3,1004};
    int n = 7;
    qsort(t, n, sizeof(int), cmpfn);
    int p1 = t[0] ^ 1;
    int p2 = t[0] ^ 1;
    int i;
    for (i = 0; i < n; i++) {
        if (t[i] == p1 && t[i] != p2) {
            printf("%d ", t[i]);
        }
        p2 = p1;
        p1 = t[i];
    }
    putchar('\n');
    return EXIT_SUCCESS;
}

p1 i p2 to dwie ostatnio sprawdzane liczby. Jeżeli t[0] != t[1] to na początku p1 musi być różny od t[0]. W innym wypadku wartości początkowe nie mają wpływu na wynik. Algorytm skanuje liczby od lewej do prawej i wypisuje zawsze tylko i wyłącznie drugie wystąpienie aktualnie zeskanowanej wartości.

Wersja ze zliczaniem:

#include <stdio.h>

int main(int argc, char** argv) {
    int r, i, v, c[1234];
    for (i = 0; i < 1234; i++)
        c[i] = 0;
    r = scanf("%d", &i);
    while (i-- > 0) {
        r = scanf("%d", &v);
        ++c[v];
    }
    for (i = 0; i < 1234; i++)
        if (c[i] > 1)
            printf("%d ", i);
    putchar('\n');
    return 0;
}
0

A jaki jest zakres tych liczb? Bo jak są jakoś ograniczone to moznaby próbować zliczaniem.

0

Dzięki bardzo

0

No kurcze przecież program działa, rozumiem jego schemat liczenia, wszystko jest ok a mimo to maszynka sprawdzająca zwraca mi już za 8 razem "błąd uruchomienia" wysyłałem w c, c++, z różnymi nagłówkami, w przestrzeni std, inicjowałem zerami no nie chce przyjąć, może masz pomysł co to może znaczyć w stosunku do kodu ? co może jej nie pasować usunąłem system("pause"); - tego nie może być i nadal nic ...

0

Pokaż kod, najlepiej wrzuć na ideone.com z jakimś przykładowym inputem. Za wysłanie system("pause") na sprawdzarkę powinieneś zostać skazany na 3 lata robót publicznych.

0

Za wysłanie system("pause") na sprawdzarkę(...)

Nie wysyłałem, napisałem to aby uniknąć odpowiedzi typu "sprawdź czy usunąłeś system("pause");"

Link z wejściem z zadania na ideone
http://ideone.com/Ycln2

0

Jak widzisz, tablica c ma 1234 elementy, co wraz ze strukturą kodu gwarantuje poprawność jedynie gdy liczby wejściowe są z zakresu 0..1233. Użyj wersji z sortowaniem jeśli chcesz obsługiwać większy zakres (na pewno zadziała dla zakresu -miliard...+miliard).

0

napisałem sobie od nowa, jest jeden problem, w momencie gdy mam np. trzy trójki pod rząd, dublują się one wyjściu, lepiej to widać w kodzie. Chodzi o to aby porównywanie zaczynało się od miejsca gdzie była ostatnia liczba która wystąpiła więcej niż raz, wpisałem tam zmienną licznik którą chciał bym użyć ale nie bardzo wiem jak poprawnie wstawić ją w kod, przy wszystkich kombinacjach zawiesza mi program, chce tak zmienić wartość a, żeby kolejna pętlą sprawdzająca el.tablicy rozpoczynała się od miejsca w którym skończyły się równe cyfry... będę wdzięczny za pomoc

#include <iostream>
#include <cstdlib>
 
using namespace std; 
 
int cmpfn(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}
 
int main() {
    int lt=0;
    cin>>lt; 
    //int licznik=1; 
    int * t=new int[lt];
    int * p=new int[lt];
    for (int w=0; w<lt; w++) // inicjuję tablicę, p jedynkami ponieważ tam będę przechowywał ile razy powwtórzyła się dana cyferka
    {                        // np. pod p[2] będzie liczba powtórzeń cyferki która znajduje sie pod t[2]
        p[w]=1;
        t[w]=0;
    }
    for(int i=0; i<lt; i++)//do tablicy t wczytuje liczby
    {
            cin>>t[i];
    }
    qsort(t, lt, sizeof(int), cmpfn);//sortuje liczby wczytane do tablicy t
    for(int a=0; a<lt; a++)//tutaj sprawdzam literki czy się powtarzają, 
    {
            for(int b=a+1; b<lt; b++) //a+1 aby przy porównywaniu cały czas poruszać się do przodu (nie porównywać elementów poprzednich)
            {
                    if(t[a]==t[b])
                    {
                                  ++p[a]; //tutaj zapisuje liczbe powtorzeń cyfry będącej na miejscu t[a] do p[a]
                                  //++licznik;
                    }
                    else break; // przerywam jeżeli kolejna liczba jest różna, są posortowane więc jest o.k
            }
            //a=licznik;
                           
    }
    for (int c=0; c<lt; c++)//wyświetlam z tablicy p, cyfre powtórzoną więcej niż raz
    {
        if (p[c]>=2)
        cout << t[c] <<endl;
    }
    delete[] t;
    delete[] p;
    system ("pause");
    return 0;
}
0

Skoro to C++ to dlaczego nie tak:

#include <iostream>
#include <map>

using namespace std;

int main() {
  int num = 0;
  map<int, int> numbers;

  while (cin >> num) {
    numbers[num]++;
  }

  for (auto &num: numbers) {
    if (num.second > 1) {
      cout << num.first << " ";
    }
  }
  
  cout << endl;

  return 0;
}

Tam pewnie by coś trzeba zmienić, jeżeli chodzi o wejście, bo liczba liczb nie jest potrzebna.

0

Czyste C:

#include <stdio.h>
#include <stdlib.h>
 
int cmpfn(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}
 
int main(int argc, char** argv) {
    int n, i, r;
    int *t;
    r = scanf("%d", &n);
    t = malloc(sizeof(int) * n);
    for (i = 0; i < n; i++)
        r = scanf("%d", t + i);
    qsort(t, n, sizeof(int), cmpfn);
    int p1 = t[0] ^ 1;
    int p2 = t[0] ^ 1;
    for (i = 0; i < n; i++) {
        if (t[i] == p1 && t[i] != p2) {
            printf("%d ", t[i]);
        }
        p2 = p1;
        p1 = t[i];
    }
    putchar('\n');
    free(t);
    return EXIT_SUCCESS;
}
0

Kurcze żadnego nie kompiluje, @wibwoit przy alokowaniu pamięci kompilator wyświetla: "invalid conversion from void*' to int*' " @Endrju

Tam pewnie by coś trzeba zmienić, jeżeli chodzi o wejście, bo liczba liczb nie jest potrzebna.
domyślam, że chodzi o mój kod. Kompilowałem twój ale przy auto num jest błąd ... nie potrafię nawet samemu poprawić, cienias ze mnie...

0

Nie kompiluje się ponieważ rezultat malloca powinieneś rzutować na int *. Jak używasz kompilatora C++ to najczęściej musisz, w C jest to dobrą konwencją.

0

Nie kompiluje się ponieważ rezultat malloca powinieneś rzutować na int *. Jak używasz kompilatora C++ to najczęściej musisz

na ideone, przy kompilatorze c, również jest błąd wykonania.

0

Błąd wykonania? http://www.ideone.com/1wHZ4

0

dziwne, nic nie modyfikowałem, http://ideone.com/U5YJh
Oczywiście uczelniana maszynka przyjęła. Dzięki, ale to tak z ciekawości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1