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;
}
|