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

Fişierul text Numere.in conţine cel mult 1000 de numere naturale cu cel mult patru cifre fiecare, despărţite prin câte un spaţiu.
a) Scrieţi programul care citeşte numerele din fişierul Numere.in şi afişează în fişierul de ieşire Rezultate.out, în ordine crescătoare, acele numerele din fişierul de intrare care au toate cifrele egale. Pentru a verifica dacă toate cifrele unui număr sunt egale veţi folosi un subprogram care primeşte ca parametru un număr natural x de cel mult patru cifre si returnează numărul de cifre distincte ale lui x. Dacă fişierul nu conţine nici un astfel de număr, atunci se va scrie în fişierul de ieşire mesajul NU EXISTA.
b) Daca exista astfel de numere afişaţi factorii primi împreuna cu exponenţii lor, din descompunerea in factori primi al celui mai mare număr care are toate cifrele egale. Afişarea se va face in fişierul Rezultate.out, începând cu cea dea doua linie, fiecare factor si exponentul sau pe cate o linie in fişier separaţi de cate un spaţiu.

Exemplu: dacă fişierul Numere.in are următorul conţinut:
30 11 444 7 25 5

Fişierul Rezultate.out va avea următorul conţinut:

5 7 11 444
2 2
3 1
37 1

Cel mai mare număr care are toate cifrele egale este 444 iar 444=  2^{2}  +  3^{1}  +  37^{1}


sanziana009: Am scris subprogramul pt cifre distincte:
sanziana009: int cifredistincte(int x)
{ int nr=0, fr[10],i;
for(i=0;i<=9;i++)
fr[i]=0;
while(x!=0)
{ fr[x%10]++;
x=x/10;
}

for(i=0;i<=9;i++)
if(fr[i]>0) nr++;
return nr;

}
sanziana009: PUNCTUL a) L-AM FACUT PANA LA URMA. AJUTOR LA PUNCTUL b)

Răspunsuri la întrebare

Răspuns de blindseeker90
2
#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_cifre_distincte(int x){
//daca x este de 4 cifre, putem extrage direct care sunt acele cifre
//prin impartirea la diversele puteri ale lui 10
//exemplu 3465
//a=3465/1000-3
//b=(3465/100)%10=34%10=4
//c=(3465%100)/10=65/10=6
//d=3465%10=5
//asta daca este de 4 cifre. Daca nu, trebuie simplificat
int a,b,c,d,nr=0,i,cifre[11];
//initializam sirul de cifre cu 0
for(i=0;i<11;i++){
cifre[i]=0;
}

if(x/1000>0){
a=x/1000;
b=(x/100)%10;
c=(x%100)/10;
d=x%10;
}
//daca are 3 cifre
else if(x/100>0){
a=x/100;
b=(x%100)/10;
c=x%10;
//d nu mai avem nevoie, deci punem valoare de 10 adica invalida
//caci 10 nu este o cifra
d=10;
}
//daca nu, atunci are doar 2 cifre
else if(x/10>0){
a=x/10;
b=x%10;
//c si d nu mai avem nevoie
c=10;
d=10;
}
//daca nu, este una singura
else{
a=x;
b=10;
c=10;
d=10;
}
//incrementam elementele din vector care au index cele 4 cifre cu cate 1
cifre[a]++;
cifre[b]++;
cifre[c]++;
cifre[d]++;
//trecem prin toate pozitiile. Daca valoarea pozitiei este mai mare decat 0
//atunci este cel putin o cifra distincta
for(i=0;i<10;i++){
if(cifre[i]>0){
nr++;
}
}
return nr;

}

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

void extragere_factori_primi(int n){

int i,exp,aux=n;
cout<<"Argument f: "<<n;

for(i=2;i<=aux/2;i++){
//daca i este divizor al lui n
if(n%i==0){
//initializam exponentul
exp=0;
while(n%i==0){
exp++;
n=n/i;
}
fon<<i<<" "<<exp;
fon<<endl;
}
}
}

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;
// cout<<nr_cifre_distincte(33)<<endl;
while(fin>>n){
//daca nr de cifre este una singura
 if(nr_cifre_distincte(n)==1){
 
//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;
}
}
//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;
}
extragere_factori_primi(numere[nr_sol-1]);
return 0;
}
Alte întrebări interesante