Megoldások - 2025. speciális

I.2

KIMENET: 2050 205 205 20 2 2 0 20 2050

f(2050)
|    cout << 2050
|    f(205)
|    |    cout << 205
|    |    cout << 205
|    |    f(20)
|    |    |    cout << 20
|    |    |    f(2)
|    |    |    |    cout << 2
|    |    |    |    cout << 2
|    |    |    |    f(0)
|    |    |    |    |    cout << 0
|    |    |    |    []
|    |    |    []
|    |    |    cout << 20
|    |    []
|    []
|    cout << 2050
[]

II.1.c

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

int main()
{
    int m, n;
    cin >> m >> n;

    for (int i = n; i >= m; i--) {
        int x = i;
        int c = x%10;

        do {
            x = x / 10;
        } while (x%10 == c);

        if (x == 0)
            cout << i << ' ';
    }

    return 0;
}

II.1.d

    citește m,n (numere naturale nenule, m≤n)
    ┌pentru i<-n,m,-1 execută
    │ x<-i
    │ c<-x%10
    │ ┌repetă
    │ │ x<-[x/10]
    │ └până când x%10≠c
    │ ┌dacă x=0 atunci
    │ │ s
    │ []
    []

átírva:

    citește m,n
        (numere naturale nenule, m≤n)
    i <- n
    ┌cât timp i>=m execută
    │ x<-i
    │ c<-x%10
    │ ┌repetă
    │ │ x<-[x/10]
    │ └până când x%10≠c
    │ ┌dacă x=0 atunci
    │ │ scrie i, ' '
    │ []
    │ i <- i - 1
    []

III.1.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int diviz(int n)
{
    int rez = 1;

    for (int i = 1; i*i <= n; i++)
        if (n%(i*i) == 0)
            rez = i*i;

    return rez;
}

III.2

 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
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char str[500];
    cin.getline(str, 101);
    char eredmeny[500] = "";

    bool elso = true;

    char *p = strtok(str, " ");
    while (p != NULL) {

        if (elso)
            elso = false;
        else
            strcat(eredmeny, " - ");

        strcat(eredmeny, p);

        p = strtok(NULL, " ");
    }

    strcpy(str, eredmeny);

    cout << str << endl;
    return 0;
}

III.3

b)

 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
include <iostream>
#include <fstream>
using namespace std;

void csere(int &x, int &y)
{
    int temp = x;
    x = y;
    y = temp;
}


int main()
{
    ifstream fin("bemenet.txt");

    int a, b, c;

    int frek[101] = {};

    while (fin >> a >> b >> c) {

        if (b > a)
            csere(a, b);

        if (c > a)
            csere(a, c);

        if (a*a == b*b + c*c)
            frek[a]++;
    }

    int max_frek = 0;

    for (int i = 1; i <= 100; i++)
        if (frek[i] > max_frek)
            max_frek = frek[i];

    cout << max_frek << endl;
    return 0;
}

a)

A program beolvas a memóriába számhármasokat (az A, B, C változókba), ezek tagjait ha kell felcseréli úgy, hogy az A változóban legyen a maximum. Ellenőrizzük, hogy az aktuális számhármas egy derékszögű háromszöget ábrázol-e (AA == BB + C*C), és ha igen, akkor egy frekvenciatömbbel leszámoljuk, hogy melyik A érték milyen gyakran jelent meg. A végén a gyakoriságok közül maximumot keresünk.

A program idő szempontjából hatékony, mert csak egyszer halad végig a számhármasokon, mindegyikre konstans számú lépést végez.