While - feladatok

Készítsünk felhasználói fiókot a pbinfo.ro oldalon. Itt programozás feladatok vannak, melyek megoldását ha beküldjük, a rendszer lefuttatja különböző bemenetekre és ellenőrzi, hogy jó-e a kimenetünk.

(HF) Próba-feladat: https://www.pbinfo.ro/probleme/939/sum00
Két számot kell beolvasni és az összegüket kiírni.

Feladatok pbinfo-ról:

1.

https://www.pbinfo.ro/probleme/3984/afisare-m2
Beolvassuk az a és b természetes számokat, ki kell írni az első b darab pozitív többszörösét a-nak.

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

int main()
{
    int a,b;
    cin >> a >> b;

    int i = 1;

    while (i <= b) {
        cout << i*a << " ";
        i = i + 1;
    }

    cout << endl;
    return 0;
}

Más megoldás:

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

int main()
{
    int a,b;
    cin >> a >> b;

    int i = a;

    while (i <= b*a) {
        cout << i << " ";
        i = i + a;
    }

    cout << endl;
    return 0;
}

2.

https://www.pbinfo.ro/probleme/330/afisarenumerepare
Beolvasunk egy n-t, ki kell írni az első n darab nem nulla páros számot.

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

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

    int i = 1;

    while (i <= n) {
        cout << i*2 << " ";
        i = i + 1;
    }

    cout << endl;
    return 0;
}

3.

https://www.pbinfo.ro/probleme/1362/p10
Adott n, ki kell írni 10n-t (nem kell kiszámolni, mert ahhoz túl nagy).

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

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

    cout << 1;

    int i = 1;

    while (i <= n) {
        cout << 0;
        i = i + 1;
    }

    cout << endl;
    return 0;
}

4.

https://www.pbinfo.ro/probleme/348/afisareputeri
Adott n és p esetén ki kell írni az n szám p-nél kisebb vagy egyenlő hatványait.

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

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

    int szam = 1;

    while (szam <= p) {
        cout << szam << " ";
        szam = szam * n;
    }

    cout << endl;
    return 0;
}

5.

https://www.pbinfo.ro/probleme/4294/perechin
Adott n esetén ki kell írni az összes olyan x y számpárt, melyre x + y = n és 0 < x ≤ y.

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

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

    int x = 1;

    while (x <= n-x) {
        cout << x << " " << n-x << endl;
        x = x + 1;
     }

    return 0;
}

Ciklusok egymásban

6.

Adott n esetén írjuk ki az n értéket n x n-szer! Például n = 5-re a kimenet:

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

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

    int j = 1;
    while (j <= n) {
        // kiírunk egy sort:
        int i = 1;
        while (i <= n) {

            //cout << n << " ";
            cout << i << " ";

            i = i + 1;
        }
        cout << endl;

        j = j + 1;
    }

    return 0;
}

7.

https://www.pbinfo.ro/probleme/351/piramida
Adott n-re ki kell írni a leírásban látható háromszöget.

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

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

    int i = 1;

    while (i <= n) {

        // 1 2 ... i
        int j = 1;
        while (j <= i) {
            cout << j << " ";
            j = j + 1;
        }
        cout << endl;

        i = i + 1;
    }

    return 0;
}

8.

https://www.pbinfo.ro/probleme/1630/morisca
Adott n-re el kell készíteni az ábrán látható rajzot (kiírásokkal).

HF (opcionális)

Összegek, szorzatok kiszámítása

Példa összeg kiszámítására: adott n-re meghatározzuk az első n darab pozitív egész szám összegét:

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

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

    int osszeg = 0;

    int i = 1;
    while (i <= n) {
        osszeg = osszeg + i;
        i = i + 1;
    }

    cout << osszeg << endl;
    return 0;
}

9.

Adott n ≥ 3 esetén írjuk ki az 1*2*3 + 2*3*4 + ... + (n-2)*(n-1)*n összeg értékét! Ha n < 3, akkor írjunk ki egy hibaüzenetet!

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

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

    int osszeg = 0;

    if (n < 3) {
        cout << "tul kicsi n..." << endl;
    }
    else {
        int i = 1;
        while (i <= n-2) {
            osszeg = osszeg + i*(i+1)*(i+2);
            i = i + 1;
        }

        cout << osszeg << endl;
    }
    return 0;
}

Képlettel:

    S = sum(i*(i+1)(i+2),  i = 1, ... , n-2)
      = sum(i^3 + 3i^2 + 2*i,   ....)
      = (n-2)^2(n-1)^2/4
        + 3 * (n-2)(n-1)(2n-3)/6
        + 2 * (n-1)(n-1)/2

      = 1/4*(n-2)*(n-1) * (

            (n-2)(n-1) + 2*(2n-3) + 4

        )

      = 1/4*(n-2)*(n-1) * (n^2 + n)
      = 1/4*(n-2)*(n-1)*n*(n+1)

10.

Adott n esetén számítsuk ki az első n darab teljes köb összegét! Például n = 3-ra a kimenet 36 (mert 13 + 23 + 33 = 36).

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

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

    int osszeg = 0;

    int i = 1;
    while (i <= n) {
        osszeg = osszeg + i*i*i;
        i = i + 1;
    }

    cout << osszeg << endl;

    cout << n*(n+1)*n*(n+1)/4;
    return 0;
}

11.

Számítsuk ki az n-nél kisebb négyzetszámok öszegét! Például: n = 20 esetén a válasz legyen 30 (0 + 1 + 4 + 9 + 16).

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

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

    int osszeg = 0;

    int i = 1;
    while (i*i < n) {
        osszeg = osszeg + i*i;
        i = i + 1;
    }

    cout << osszeg << endl;

    return 0;
}

12.

Számítsuk ki adott n pozitív egész faktoriálisát (n! = 1 * 2 * ... * n). Például n = 5 esetén a válasz legyen 120 (1*2*3*4*5).

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

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

    int szorzat = 1;

    int i = 1;
    while (i <= n) {
        szorzat = szorzat * i;
        i = i + 1;
    }

    cout << szorzat << endl;
    return 0;
}

13.

Adott n esetén számítsuk ki az első n darab pozitív egész faktoriálisának összegét! Például n = 4 esetén a válasz legyen 33 (1+2+6+24).

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

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

    int osszeg = 0;

    int i = 1;
    while (i <= n) {

        // kiszámítjuk az i faktoriálisát
        int faktorialis = 1;

        int j = 1;
        while (j <= i) {
            faktorialis *= j;
            j++;
        }

        osszeg = osszeg + faktorialis;
        i++;
    }

    cout << osszeg << endl;
    return 0;
}

Ötlet: megjegyezzük az előző faktoriálist és abból számoljuk ki az újat egyetlen szorzással.

 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 n;
    cin >> n;

    int osszeg = 0;
    int faktorialis = 1;

    int i = 1;
    while (i <= n) {
        faktorialis *= i;

        osszeg = osszeg + faktorialis;
        i++;
    }

    cout << osszeg << endl;
    return 0;
}

14. (+0.5 pont)

Adott az n természetes szám. Írjuk ki a valódi osztóinak összegét és a legnagyobb valódi osztóját (ha van).

 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>
using namespace std;

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

    int osszeg = 0;
    int utolso = -1;

    int i = 2;
    while (i <= n-1) {

        if (n % i == 0) {
            osszeg += i;
            utolso = i;
        }

        i++;
    }

    cout << "osszeg: " << osszeg << endl;
    if (utolso == -1)
        cout << "nincs valodi oszto" << endl;
    else
        cout << "a legnagyobb: " << utolso << endl;

    return 0;
}

15. (+1 pont)

Adott egy páratlan n érték. Készítsük egy n x n méretű ábrát, amin egy, az alábbihoz hasonló rombusz látható (a legtöbb #-et tartalmazó soron n darab kell legyen ebből).

Pl. n = 7 esetén:

       #
      ###
     #####
    #######
     #####
      ###
       #

Pl. n = 15 esetén:

           #
          ###
         #####
        #######
       #########
      ###########
     #############
    ###############
     #############
      ###########
       #########
        #######
         #####
          ###
           #