/*
Niz integera i njegovi razni podnizovi.
Podniz moze imati najmanje dva broja.
eliminisi_duple_brojeve_u_podnizovima(niz,&n);
ostavi_samo_podnizove_sa_duplim_brojevima(niz,&n);
podnizovi_istih_parnih_brojeva(niz,&n);
podnizovi_istih_neparnih_brojeva(niz,&n);
podnizovi_parnih_brojeva(niz,&n);
podnizovi_neparnih_brojeva(niz,&n);
najduzi_podniz_istih(niz,n);
*/
#include <stdio.h>
void PrikaziNiz( int niz[], int brClanova )
{
int i;
printf("\n");
for(i=0;i<brClanova;i++)
printf("%3d", niz[i] );
printf("\n");
}
void StampajIndekseNiza( int niz[], int brClanova )
{
int i;
printf("\n\n");
for(i=0;i<brClanova;i++)
printf("%3d", i );
printf("\n");
}
// Nalazi i prikazuje najduzi podniz istih brojeva.
void najduzi_podniz_istih(int niz[],int n)
{
int i=0; // M znaci memorisane vrednosti i to je krajnji rezultat
int Mmax_indeks, Mmax_karakter, Mmax_duzina=0;
int T_indeks, T_karakter, T_duzina; // T znaci trenutne vrednosti
while(i<n){ // za sve clanove niza
// Preskaci dok ne naidjes na podniz (bar dva ista broja)
while( niz[i] != niz[i+1] && i < n ) // dok je tekuci razlicit od sledeceg
i++; // prelazimo na sledeci clan niza
// Sada smo na prvom clanu tekuceg podniza i pamtimo njegove karakteristike
T_indeks=i; // indeks pocetka tekuceg podniza
T_karakter=niz[i]; // karakter (broj) koji cini tekuceg podniz
T_duzina=0; // anuliramo brojac clanova tekuceg podniza
// brojimo duzinu trenutnog podniza
while( niz[i] == niz[i+1] && i < n ){ // dok je tekuci jednak sledecem
T_duzina++; // uvecavamo brojac clanova tekuceg podniza
i++; // prelazimo na sledeci clan niza
}
// Odredjivanje naduzeg podniza.
// Ako je najduzi manji od tekuceg onda tekuci postaje najduzi.
if(Mmax_duzina < T_duzina) { // Ako je maksimalni manji od tekuceg,
Mmax_indeks = T_indeks; // tekuci podniz postaje maksimalni podniz.
Mmax_karakter = T_karakter;
Mmax_duzina = T_duzina;
}
}
Mmax_duzina++; // duzinu najduzeg uvacavamo za 1
// Prikazujemo izvestaj
printf("\n\n Najduzi podniz istih brojeva pocinje od indeksa %d, i ima %d karaktera %d \n\n",
Mmax_indeks, Mmax_duzina, Mmax_karakter);
// Prikazujemo najduzi podniz datog niza
printf("\n Najduzi podniz istih brojeva je: ");
for( i=Mmax_indeks; i<=Mmax_indeks+Mmax_duzina-1; i++ )
printf(" %d",niz[i]);
}
// Eliminise duple brojeve u podnizovima, menja broj clanova novog niza
void eliminisi_duple_brojeve_u_podnizovima(int niz[],int *n)
{
int i=0, n1=0; // n1 je indeks novog niza
while ( i < *n ){ // od pocetka do kraja niza
if( niz[i+1] != niz[i] ) // ako sledeci nije jednak trenutnom
niz[n1++] = niz[i++]; // stavi ga u niz
while ( niz[i+1] == niz[i] ) // dok je sledeci jednak trenutnom
i++; // predji na sledeci
}
*n = n1; // novi broj clanova niza
printf("\n eliminisi_duple_brojeve_u_podnizovima \n");
PrikaziNiz(niz,*n);
}
// Ostavlja samo podnizove sa duplim brojevima, menja broj clanova novog niza
void ostavi_samo_podnizove_sa_duplim_brojevima(int niz[],int *n)
{
int i=0, n1=0; // n1 je indeks novog niza
while ( i < *n ){ // od pocetka do kraja niza
while ( niz[i] == niz[i+1] ) // dok je tekuci jednak sledecem
niz[n1++] = niz[i++]; // tekuci stavi u niz
// Bez ovog if-a podnizovi bi bili skraceni za jedan element
// probaj da iskljucis taj if i videces problem:
if( niz[i] == niz[i-1] ) // ako je tekuci jednak prethodnom
niz[n1++] = niz[i++]; // i njega (tekuci) stavi u niz
while ( niz[i] != niz[i+1] ) // dok tekuci nije jednak sledecem
i++; // predji na sledeci
}
*n = n1; // novi broj clanova niza
printf("\n ostavi_samo_podnizove_sa_duplim_brojevima \n");
PrikaziNiz(niz,*n);
}
// Ostavlja samo podnizove sa istim parnim brojevima, menja broj clanova novog niza
void podnizovi_istih_parnih_brojeva(int niz[],int *n)
{
int i=0,n1=0; // n1 je broj clanova novog niza
while(i<*n){ // od pocetka do kraja niza
// preskoci neparne brojeve
while(niz[i]%2 != 0) // dok je tekuci neparan
i++; // predji na sledeci clan niza
// tekuci je sada paran i zato je dovoljno da pitao da li je jednak sledecem
while(niz[i] == niz[i+1]) // dok je tekuci jednak sledecem
niz[n1++]=niz[i++]; // stavi tekuci u niz
// dodaj poslednji parni iz podniza parnih
if( niz[i] == niz[i-1] ) // ako je tekuci jednak prethodnom
niz[n1++] = niz[i++]; // i njega (tekuci) stavi u niz
i++; // predji na sledeci clan niza
}
*n=n1; // broj elemenata novog niza
printf("\n podnizovi_istih_parnih_brojeva \n");
PrikaziNiz(niz,*n);
}
// Ostavlja samo podnizove sa istim neparnim brojevima, menja broj clanova novog niza
void podnizovi_istih_neparnih_brojeva(int niz[],int *n)
{
int i=0, n1=0; // n1 je indeks novog niza
while ( i < *n ){ // od pocetka do kraja niza
if( niz[i]%2 == 0 ) { // ako je paran
i++; // predji na sledeceg
continue; // odmah idi na glavnu while( i < *n ) petlju
}
// tekuci je sada neparan
// dok je tekuci jednak sledecem
while ( niz[i] == niz[i+1] )
niz[n1++] = niz[i++]; // tekuci stavi u niz
// Bez ovog if-a podnizovi bi bili skraceni za jedan element
// probaj da iskljucis taj if i videces problem:
if( niz[i] == niz[i-1] ) // ako je tekuci jednak prethodnom
niz[n1++] = niz[i++]; // i njega (tekuci) stavi u niz
i++; // predji na sledeceg
}
*n = n1; // novi broj clanova niza
printf("\n podnizovi_istih_neparnih_brojeva \n");
PrikaziNiz(niz,*n);
}
// Ostavlja samo podnizove sa parnim brojevima, menja broj clanova novog niza
void podnizovi_parnih_brojeva(int niz[],int *n)
{
int i=0, n1=0; // n1 je indeks novog niza
while ( i < *n ){ // od pocetka do kraja niza
// Dok tekuci nije paran
while ( niz[i]%2 != 0 )
i++; // predji na sledeceg
// Dok su i tekuci i sledeci parni
while ( niz[i]%2 == 0 && niz[i+1]%2 == 0 )
niz[n1++] = niz[i++]; // tekuci stavi u niz
// Bez ovog if-a podnizovi bi bili skraceni za jedan element
// probaj da iskljucis taj if i videces problem:
if( niz[i-1]%2 == 0 ) // ako je prethodni od trenutnog paran
niz[n1++] = niz[i++]; // i njega (tekuci) stavi u niz
i++; // predji na sledeceg
}
*n = n1; // novi broj clanova niza
printf("\n podnizovi_parnih_brojeva \n");
PrikaziNiz(niz,*n);
}
// Ostavlja samo podnizove sa neparnim brojevima, menja broj clanova novog niza
void podnizovi_neparnih_brojeva(int niz[],int *n)
{
int i=0, n1=0; // n1 je indeks novog niza
while ( i < *n ){ // od pocetka do kraja niza
// Dok je tekuci paran
while ( niz[i]%2 == 0 && i < *n )
i++; // predji na sledeceg
// Dok su i tekuci i sledeci neparni
while ( niz[i]%2 != 0 && niz[i+1]%2 != 0 )
niz[n1++] = niz[i++]; // tekuci stavi u niz
// Bez ovog if-a podnizovi bi bili skraceni za jedan element
// probaj da iskljucis taj if i videces problem:
if( niz[i-1]%2 != 0 ) // ako je prethodni od tekuceg neparan
niz[n1++] = niz[i++]; // i njega (tekuceg) stavi u niz
i++; // predji na sledeceg
}
*n = n1; // novi broj clanova niza
printf("\n podnizovi_neparnih_brojeva \n");
PrikaziNiz(niz,*n);
}
int main(void)
{
// int niz[] = {1,1,1,2,3,3,4,5,5,5,5,6,7,8,8,8,8,9,9};
int niz[] = {1,2,3,3,4,4,4,5,5,5,6,6,7,8,8,8,8,9};
// int niz[] = {1,2,3,2,2,4,-2,4,4,4,4,5,2,2,2,6,2,7};
// int niz[] = {1,2,3,2,2,4,-2,4,4,4,4,5,2,2,2,6,2,7,4,4,4,4,4,4};
// int niz[] = {4,4,4,4,4,4,4,1,2,3,2,2,4,-2,4,4,4,4,5,2,2,2,6,2,7};
int n=sizeof(niz)/sizeof(int);
printf("\n Duzina niza n = %d \n",n);
StampajIndekseNiza(niz,n);
PrikaziNiz(niz,n);
// eliminisi_duple_brojeve_u_podnizovima(niz,&n);
// ostavi_samo_podnizove_sa_duplim_brojevima(niz,&n);
// podnizovi_istih_parnih_brojeva(niz,&n);
// podnizovi_istih_neparnih_brojeva(niz,&n);
// podnizovi_parnih_brojeva(niz,&n);
// podnizovi_neparnih_brojeva(niz,&n);
najduzi_podniz_istih(niz,n);
printf("\n\n");
return 0;
}