Informatică, întrebare adresată de Saharra, 9 ani în urmă

Scrieţi în limbajul C/C++ definiţia completă a subprogramului apartenenta, care primeşte ca argument un număr natural nenul n şi returnează valoarea 1 dacă n aparţine mulţimii H={2 x ⋅3 y ⋅5 z |x,y,z∈N}
H={2x⋅3y⋅5z|x,y,z∈N}
, respectiv 0 în caz contrar.
Restricții și precizări
•1 ≤ n ≤ 109

Exemple

apartenenta(180) = 1
apartenenta(385) = 0


Acesta ar fi codul meu:
int apartenenta(int n)
{if(n%30==0)
return 1;
if(n%30!=0) return 0;
}

Nu inteleg de ce iau doar 55 puncte...


JolieJulie: nici eu...avand in vedere ca e un subprogram,e ok daca nu precizezi apartenenta x,y,z la N si ca 1 ≤ n ≤ 109...poate ca trebuia sa pui restrictiile in functie...desi nu cred
Saharra: off... :))
blindseeker90: Te referi cumva la problema asta? https://www.pbinfo.ro/?pagina=probleme&id=1539 Adica valorile de x,y,z sunt exponenti?
Saharra: da

Răspunsuri la întrebare

Răspuns de blindseeker90
2
In raspunsul tau, ai presupus ca x,y si z sunt toate mai mari decat 0.
In acel caz, inmultite valorile 2*3*5=30 deci intr-adevar ar trebui sa fie multiplu de 30.
Dar daca oricare dintre ele ar fi egal cu 0, atunci factorul respectiv ar deveni valoarea neutra, adica 1.
Deci pot sa apartina multimii H si combinatii de produse de 2 sau un singur factor la orice putere.
De exemplu, 40=2^3*5 face parte din H, la fel si 27=3^3 sau 4=2^2
Atunci, o tactica buna ar fi sa imparti numarul n la fiecare dintre factorii respectivi pana cand nu se mai imparte exact.
Daca la final, obtii valoarea 1, inseamna ca n este un produs doar din acei factori. Daca obtii o valoare diferita de 1, inseamna ca mai sunt si alti factori diferiti de 2 3 si 5.
Subprogramul la care m-am gandit este cel de mai jos

int apartenenta(int n){
while(n%5==0){
n=n/5;
}
while(n%3==0){
n=n/3;
}
while(n%2==0){
n=n/2;
}
if(n==1){
return 1;
}
else{
return 0;
}
}

Saharra: Esti un geniu :) Multumesc mult!
Alte întrebări interesante