Fişierul text Numere.txt conţine pe prima linie un număr natural k (0
a) Scrieţi un program care afişează in fişierul de ieşire Numere.out, în ordine crescătoare, separate de cate un spaţiu, acele numere din fişierul Numere.txt care au cel puţin k divizori proprii. Dacă un număr care corespunde cerinţei apare de mai multe ori, se va afişa o singură dată.
b) Verificaţi dacă cifrele ultimului număr scris în fişierul de ieşire Numere.out au aceeaşi paritate (toate pare sau toate impare), şi afişaţi pe ecran un mesaj corespunzător (DA sau NU), Veţi folosi un subprogram care primeşte prin intermediul unui parametru un număr natural n din intervalul [0, 99] si returnează atât numărul de cifre pare cat si numărul de cifre impare ale numărului n.
Exemplu: dacă fişierul Numere.txt are următorul conţinut:
4
15 36 33
36 1 12 1 24
2
fişierul Numere.out va conţine :
Fişierul Numere.out va avea următorul conţinut:
12 24
Pe ecran se va afişa DA (deoarece 2 şi 4 sunt de aceeaşi paritate)
Răspunsuri la întrebare
Răspuns de
1
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;
}
Alte întrebări interesante
Informatică,
8 ani în urmă
Fizică,
8 ani în urmă
Fizică,
8 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Geografie,
9 ani în urmă
Matematică,
9 ani în urmă