Răspuns :
Cred ca ar trebui sa fie si valoarea de 36 acolo din moment ce este si ea cu mai multi divizori proprii. Sau ar trebui ca dublajele sa fie eliminate, desi nici asta nu este mentionat in text. Implementarea mea e mai jos
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
//creaza un vector cu 10 elemente fiecare cu valoarea 0
int numere[1000];
ofstream fon("numere.out");
int nr_div_proprii(int x){
//divizorii proprii sunt divizorii diferiti de 1 si numarul insusi
//putem parcurge pana la radical(n) fiecare dintre acei divizori vor avea
//un corespondent si in partea superioara, cu exceptia radicalului insusi
//de exemplu pentru x-36 avem radical(36)=6
//atunci divizorii pana in 6 sunt: 2,3,4 care vor avea divizorii corespondenti
//mai mari decat 6: 18,12 si 9. Si Deci vor fi 3*2=6 divizori proprii la care
//se adauga radicalul intreg in acest caz, adica 6.
int i,nr_proprii=0,radical;
for(i=2;i<sqrt(x);i++){
if(x%i==0){
nr_proprii=nr_proprii+2;
}
}
radical=sqrt(x);
//verificam si radicalul
if(x%radical==0){
nr_proprii=nr_proprii+1;
}
return nr_proprii;
}
//functie pentru a intercala un element pe o pozitie intr-un vector de numere
void pune_element(int a[],int lung_sir,int poz,int x){
int i;
//daca pozitia elementului
for(i=lung_sir;i>=poz;i--){
a[i+1]=a[i];
}
a[poz]=x;
}
//aici folosesc logica negativa. Daca returneaza 1,
//inseamna ca elementul nu este in sur
int nu_este_element_sir(int a[],int n,int x){
int i;
if(n==0){
return 1;
}
for(i=0;i<n;i++){
if(a[i]==x){
return 0;
}
}
return 1;
}
//daca trebuie sa returnezi 2 valori, ai nevoie de pointeri ca argumente
void nr_paritati(int n,int* nr_pare,int* nr_impare){
int c;
*nr_pare=0;
*nr_impare=0;
while(n>0){
c=n%10;
//daca e par
if(c%2==0){
*nr_pare=*nr_pare+1;
}
else{
*nr_impare=*nr_impare+1;
}
n=n/10;
}
}
void afisare(int a[],int n){
int i;
for(i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
ifstream fin("numere.in");
int n,i,nr_sol=0,poz,k,cifre_pare,cifre_impare;
fin>>k;
// cout<<nr_cifre_distincte(33)<<endl;
while(fin>>n){
//daca nr de cifre este una singura
if(nu_este_element_sir(numere,nr_sol,n)==1&&nr_div_proprii(n)>=k){
//incepe sa cauti in sir sa vezi unde s-ar potrivi
//daca este primul din sir, atunci pune-l primul
if(nr_sol<1){
numere[0]=n;
}
else{
//pozitia invalida initial
poz=-1;
for(i=0;i<nr_sol;i++){
if(n<numere[i]){
poz=i;
break;
}
else if(n==numere[i]){
}
}
//daca pozitia a ramas invalida, atunci este cel mai mare element din sir
if(poz<0){
numere[nr_sol]=n;
}
else{
pune_element(numere,nr_sol,poz,n);
}
}
nr_sol++;
}
}
if(nr_sol==0){
fon<<"Nu exista";
}
else{
for(i=0;i<nr_sol;i++){
fon<<numere[i]<<" ";
}
fon<<endl;
}
//folosesti ampersand pentru a citi valoarea din pointeri
nr_paritati(numere[nr_sol-1],&cifre_pare,&cifre_impare);
if(cifre_pare==0||cifre_impare==0){
cout<<"DA";
}
else{
cout<<"NU";
}
return 0;
}
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
//creaza un vector cu 10 elemente fiecare cu valoarea 0
int numere[1000];
ofstream fon("numere.out");
int nr_div_proprii(int x){
//divizorii proprii sunt divizorii diferiti de 1 si numarul insusi
//putem parcurge pana la radical(n) fiecare dintre acei divizori vor avea
//un corespondent si in partea superioara, cu exceptia radicalului insusi
//de exemplu pentru x-36 avem radical(36)=6
//atunci divizorii pana in 6 sunt: 2,3,4 care vor avea divizorii corespondenti
//mai mari decat 6: 18,12 si 9. Si Deci vor fi 3*2=6 divizori proprii la care
//se adauga radicalul intreg in acest caz, adica 6.
int i,nr_proprii=0,radical;
for(i=2;i<sqrt(x);i++){
if(x%i==0){
nr_proprii=nr_proprii+2;
}
}
radical=sqrt(x);
//verificam si radicalul
if(x%radical==0){
nr_proprii=nr_proprii+1;
}
return nr_proprii;
}
//functie pentru a intercala un element pe o pozitie intr-un vector de numere
void pune_element(int a[],int lung_sir,int poz,int x){
int i;
//daca pozitia elementului
for(i=lung_sir;i>=poz;i--){
a[i+1]=a[i];
}
a[poz]=x;
}
//aici folosesc logica negativa. Daca returneaza 1,
//inseamna ca elementul nu este in sur
int nu_este_element_sir(int a[],int n,int x){
int i;
if(n==0){
return 1;
}
for(i=0;i<n;i++){
if(a[i]==x){
return 0;
}
}
return 1;
}
//daca trebuie sa returnezi 2 valori, ai nevoie de pointeri ca argumente
void nr_paritati(int n,int* nr_pare,int* nr_impare){
int c;
*nr_pare=0;
*nr_impare=0;
while(n>0){
c=n%10;
//daca e par
if(c%2==0){
*nr_pare=*nr_pare+1;
}
else{
*nr_impare=*nr_impare+1;
}
n=n/10;
}
}
void afisare(int a[],int n){
int i;
for(i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
ifstream fin("numere.in");
int n,i,nr_sol=0,poz,k,cifre_pare,cifre_impare;
fin>>k;
// cout<<nr_cifre_distincte(33)<<endl;
while(fin>>n){
//daca nr de cifre este una singura
if(nu_este_element_sir(numere,nr_sol,n)==1&&nr_div_proprii(n)>=k){
//incepe sa cauti in sir sa vezi unde s-ar potrivi
//daca este primul din sir, atunci pune-l primul
if(nr_sol<1){
numere[0]=n;
}
else{
//pozitia invalida initial
poz=-1;
for(i=0;i<nr_sol;i++){
if(n<numere[i]){
poz=i;
break;
}
else if(n==numere[i]){
}
}
//daca pozitia a ramas invalida, atunci este cel mai mare element din sir
if(poz<0){
numere[nr_sol]=n;
}
else{
pune_element(numere,nr_sol,poz,n);
}
}
nr_sol++;
}
}
if(nr_sol==0){
fon<<"Nu exista";
}
else{
for(i=0;i<nr_sol;i++){
fon<<numere[i]<<" ";
}
fon<<endl;
}
//folosesti ampersand pentru a citi valoarea din pointeri
nr_paritati(numere[nr_sol-1],&cifre_pare,&cifre_impare);
if(cifre_pare==0||cifre_impare==0){
cout<<"DA";
}
else{
cout<<"NU";
}
return 0;
}
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile și inspiraționale. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, suntem aici pentru a vă ajuta. Ne face plăcere să vă revedem și vă invităm să adăugați site-ul nostru la favorite pentru acces rapid!