[ Stevan_Chakic @ 04.11.2013. 23:19 ] @
Tekst zadatka:
1.a) Napisati proceduru void Popuni(int *x, int len) koja od korisnika učitava
prirodan broj k, a zatim popunjava niz x dužine len slučajnim brojevima iz
segmenta [1, k].
b) Dva broja su prijateljska ako imaju isti broj parnih cifara. Na primjer, brojevi
1245 i 22 su prijateljski, dok 23 i 5 nijesu. Napisati funkciju int
BrPrijateljskihTrojki(int *x, int n) koja vraća koliko u nizu ima trojki
elemenata koji su prijateljski. Na primjer, ako je niz {12,235,5,51,128,777,4},
funkcija treba da vrati 5 jer su sljedeće trojke prijateljske
(12,235,128),(12,235,4), (12,128,4),(235,128,4) i (5,51,777)
U main funkciji učitati broj elemenata niza, a zatim dinamički alocirati memoriju
za niz (koristeći malloc funkciju). Popuniti niz primjenom procedure pod a), a zatim
primjenom funkcije pod b) naći traženi broj prijateljskih trojki.

Moje rjesenje:
Code:

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

void Popuni(int *x, int len)
{
    int k;
    printf("Unesite broj k: ");
    scanf("%d", &k);

    int i;
    for (i=0; i<len; i++)
    {
        x[i] = (rand()%k) + 1;
    }
}


int prijateljski(int a, int b)
{

    int br1=0;
    int br2=0;
    while (a!=0)
    {
        if((a%10)%2==0)
        {
            br1++;
        }
        a=a/10;
    }
    while (b!=0)
    {
        if((b%10)%2==0)
        {
            br2++;
        }
        b=b/10;
    }
    if (br1==br2)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int BrPrijateljskihTrojki(int *x, int n)
{
    int i=0;
    int j=0;
    int k=0;
    int br=0;

    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++)
        {
            for(k=j+1;k<n;k++)
            {
                if (prijateljski(x[i], x[j])&&prijateljski(x[i],x[k]))
                {
                    br++;
                    printf("(%d, %d, %d), ", x[i], x[j], x[k]);

                }
            }



        }
    }
    return br;
}
int main()
{   /*int test[] = {12, 235, 5, 51, 128,777,4};
    printf("%d", BrPrijateljskihTrojki(test,7));*/

    int len=0;
    printf("Unesite duzinu niza: ");
    scanf("%d", &len);
    int* x = malloc(len*sizeof(int));
    Popuni(x, len);
    printf("Broj prijateljskih trojki u gornjem nizu je %d\n", BrPrijateljskihTrojki(x,len));


    return 0;
}


Problem je sto mi se ponavljaju k-torke.Konkretno za n=15 i k=2 imam cak 91 prijateljsku k-torku umjesto dvije.Moze li neko pomoci?
[ djoka_l @ 05.11.2013. 08:48 ] @
Prvo, primer je pogrešan, nema 5 nego 2 prijateljske trojke, ali to si verovatno već i primetio.

Druge, ne traže se RAZLIČITE prijateljske trojke nego sve, tako da program radi kako treba.

Treće, svaki put kada pokreneš program, daje istu sekvencu slučajnih brojeva, jer nisi postavio seed za generator slučajnih brojeva, pa si verovatno primetio da svaki put dobijaš isti rezultat.

Evo primera kako se uobičajeno inicijalizuje random generator:

Code (c):

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

...

/* initialize random seed: */
srand (time(NULL));
 
[ Stevan_Chakic @ 05.11.2013. 18:46 ] @
Hvala.Ovo za test primjer zaboravio da izmijenim,pogresio bio profesor.Hvala za srand(),na to nisam obratio paznju .Bilo mi je malo cudno da stampa onoliko trojki za duzinu niza 15 i za k=2.
[ djoka_l @ 05.11.2013. 18:55 ] @
Pošto u primeru imaš niz dužine 15, ukupan broj različitih trojki je odnosno 455. Verovatnoća da dođu 3 dvojke u nekoj trojci je 0.5*0.5*0.5=0.125, a ista tolika je verovatnoća da u trojci budu 3 jedinice, pa je očekivana vrednost broja prijateljskih trojki 455*0.25=113.75
[ Stevan_Chakic @ 06.11.2013. 13:46 ] @
Jasno sad u potpunosti :) Nisam se sjetio da iskoristim kombinatoriku i vjerovatnocu :)