Függvényes feladatok

Feladatok:

1.

https://www.pbinfo.ro/probleme/896/factorialf
Kell írni egy fact nevű függvényt, ami egy n természetes számot kap paraméterként és visszatéríti a faktoriálisát.

Megoldás:

1
2
3
4
5
6
7
8
9
int fact(int n)
{
    int szorzat = 1;

    for (int i = 2; i <= n; i++)
        szorzat = szorzat * i;

    return szorzat;
}

2.

https://www.pbinfo.ro/probleme/897/sumciff
Kell írni egy sumcif nevű függvényt, ami egy n természetes számot kap paraméterként és visszatéríti a számjegyei összegét.

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int sumcif(int n)
{
    int osszeg = 0;

    while (n > 0) {
        int szj = n%10;

        osszeg = osszeg + szj;

        n = n / 10;
    }

    return osszeg;
}

3.

https://www.pbinfo.ro/probleme/4704/majorimpar
Kell írni egy majImp nevű függvényt, amely két pozitív egész számot (a és b, a≤b) kap paraméterként és visszatéríti az [a,b] intervallumból az első olyan egész számot, amely „major impar” típusú, azaz a páratlan valódi osztóinak összege szigorúan nagyobb a páros valódi osztóinak összegénél. Ha nincs ilyen szám, akkor térítsen vissza 0-t.

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int majImp(int a, int b)
{
    for (int i = a; i <= b; i++) {

        int ossz_paros = 0;
        int ossz_paratlan = 0;

        for (int d = 2; d < i; d++) {
            if (i % d == 0) {
                if (d%2 == 0)
                    ossz_paros += d;
                else
                    ossz_paratlan += d;
            }
        }

        // ha i jó
        if (ossz_paratlan > ossz_paros)
            return i;
    }

    return 0;
}

4.

https://www.pbinfo.ro/probleme/906/sumacifre
Kell írni egy sumcif nevű függvényt, amely kap egy természetes számot és két kimeneti paraméteren (referencián) keresztül visszatéríti a páros illetve a páratlan számjegyek összegét (külön-külön).

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
void sumcif(int n, int &spar, int &simp)
{
    spar = 0;
    simp = 0;
    while (n > 0) {
        int szj = n % 10;

        if (szj%2 == 0)
            spar += szj;
        else
            simp += szj;

        n = n / 10;
    }
}

5.

https://www.pbinfo.ro/probleme/905/detcifre
Kell írni egy detcifre nevű függvényt, amely kap egy természetes számot és két kimeneti paraméteren (referencián) keresztül visszatéríti az első és utolsó számjegyét.

Megoldás:

1
2
3
4
5
6
7
8
9
void detcifre(int n, int &elso, int &utolso)
{
    utolso = n % 10;

    while (n >= 10) //nem csak egy szj van n-ben
        n = n / 10;

    elso = n;
}

6.

https://www.pbinfo.ro/probleme/33/multiplu
Hány olyan eleme van a tömbnek, ami többszöröse k-nak és az utolsó számjegye is k?

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int multiplu(int a[], int n, int k)
{
    int db = 0;

    for (int i = 0; i < n; i++)
        if (a[i]%k == 0 && a[i]%10 == k)
            db++;

    return db;
}

7.

https://www.pbinfo.ro/probleme/35/count
Hány olyan eleme van a tömbnek, ami nagyobb vagy egyenlő az összes elem számtani középarányosánál?

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

int count(double a[], int n)
{
    // atlag = ?

    double osszeg = 0;
    for (int i = 0; i < n; i++)
        osszeg = osszeg + a[i];

    double atlag = osszeg / n;


    // hanyan vannak >= atlag?
    int db = 0;

    for (int i = 0; i < n; i++)
        if (a[i] >= atlag)
            db++;

    return db;
}

8.

https://www.pbinfo.ro/probleme/38/shift
Körkörösen balra kell tolni egy tömb elemeit (az elsőből utolsó legyen, mindenki más eggyel balra mozduljon).

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
void shift(int x[], int n)
{
    int elso = x[0];

    for (int i = 1; i < n; i++)
        x[i-1] = x[i];

    //for (int i = 0; i <= n-2; i++)
    //    x[i] = x[i+1];

    x[n-1] = elso;
}

9.

https://www.pbinfo.ro/probleme/42/stergeelemente
Egy tömbből ki kell törölni két adott index közötti részt.

Megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
void sterge(int v[], int &n, int i, int j)
{
    int hova = i;

    for (int honnan = j+1; honnan <= n; honnan++) {
        v[hova] = v[honnan];
        hova++;
    }

    n = hova-1;
    //n = n - (j-i+1);
}

10.

https://www.pbinfo.ro/probleme/4705/fulgidenea
Adott számról ellenőrizni kell, hogy 9 számjegyű és az 1, 2, 3, 4 számjegyek mindegyike legalább egyszer szerepel-e benne, illetve más számjegy ne szerepeljen benne.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
using namespace std;

int Fulg(int n)
{
    int szj;
    int a1=0;
    int a2=0;
    int a3=0;
    int a4=0;
    int x=0;
    while(n>0)
    {
        szj=n%10;
        n=n/10;
        if(szj==1)
        {
            a1=a1+1;
        }
        else if(szj==2)
        {
            a2=a2+1;
        }
        else if(szj==3)
        {
            a3=a3+1;
        }
        else if(szj==4)
        {
            a4=a4+1;
        }
        else
        {
            x=1;
            n=0;
        }
    }

    if((a1>0)&&(a2>0)&&(a3>0)&&(a4>0)
       &&(a1+a2+a3+a4==9)
       &&(x==0))
    {
        return 1;
    }

    return 0;
}


int main()
{
    cout << Fulg(12314) << endl; // 0
    cout << Fulg(112253513) << endl; // 0
    cout << Fulg(112243457) << endl; // 0
    cout << Fulg(111122223) << endl; // 0

    cout << Fulg(112243413) << endl; // 1

    return 0;
}

11.

https://www.pbinfo.ro/probleme/25/celmaimarenr
Adott egy szám, melyik az a legnagyobb érték, ami előállítható a számjegyeiből?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int cmmnr(int n)
{
    int szamjegyek[20];
    int nr_szj = 0;

    do {
        szamjegyek[nr_szj] = n%10;
        n = n/10;
        nr_szj++;
    }
    while (n > 0);

    // rendez:
    for (int i = 0; i < nr_szj; i++)
        for (int j = i+1; j < nr_szj; j++)
            if (szamjegyek[i] < szamjegyek[j]) {
                int temp = szamjegyek[i];
                szamjegyek[i] = szamjegyek[j];
                szamjegyek[j] = temp;
            }

    int uj = 0;

    for (int i = 0; i < nr_szj; i++)
        uj = uj * 10 + szamjegyek[i];

    return uj;
}

12. (+0.5 pont)

https://www.pbinfo.ro/probleme/4235/perechidivp
Hány olyan elempár képezhető az a tömb elemeiből, amelyben az elemek összege többszöröse P-nek? Ötlet: frekvenciatömb.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
long long PerechiDivP(int a[], int n, int p)
{
    long long nr[1001] {};

    for (int i = 0; i < n; i++)
        nr[a[i]%p]++;

    long long sol = 0;
    for (int i = 1; i < p; i++)
        sol += nr[i] * nr[p-i];

    if (p % 2 == 0) // a p/2-eseket önmagukkal nem állíthatjuk párba
        sol -= nr[p/2];

    sol = sol/2 + nr[0]*(nr[0]-1)/2; // a nulla maradékúak is külön bannak kezelve

    return sol;
}

13. (+0.5 pont)

https://www.pbinfo.ro/probleme/4214/douanumere
Két számot kell kiválasztani, úgy, hogy a számjegyeik összege azonos legyen, a számok összege pedig maximális (visszatéríteni ezt az összeget kell). Ötlet: frekvenciatömb.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
int szamjegyosszeg(int x)
{
    int s = 0;
    while (x > 0) {
        s += x%10;
        x /= 10;
    }
    return s;
}


int DouaNumere_naiv(int a[], int n)
{
    int maximum = -1;

    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++) {
            if (szamjegyosszeg(a[i])
                    == szamjegyosszeg(a[j])
                && a[i] + a[j] > maximum)
            {
                maximum = a[i]+a[j];
            }
        }

    return maximum;
}

int DouaNumere(int a[], int n)
{
    int max1[100];
        // max1[i] - melyik az a legnagyobb elem,
        //        amiben a számjegyek összege i

    int max2[100];
        // max1[i] - melyik az a MÁSODIK
        //           legnagyobb elem,
        //          amiben a számjegyek összege i


    for (int i = 0; i < 100; i++) {
        max1[i] = -1;
        max2[i] = -1;
    }

    for (int i = 0; i < n; i++) {
        int osszeg = szamjegyosszeg(a[i]);

        if (max1[osszeg] < a[i]) {

            max2[osszeg] = max1[osszeg];
            max1[osszeg] = a[i];

        }
        else if (max2[osszeg] < a[i]) {

            max2[osszeg] = a[i];
        }
    }

    int megoldas = -1;

    for (int s = 0; s < 100; s++) {
        if (max1[s] != -1 && max2[s] != -1
            && max1[s] + max2[s] > megoldas)
        {
            megoldas = max1[s] + max2[s];
        }
    }

    return megoldas;
}