Sunteți pe pagina 1din 10

1. Fişierul text date.

in conţine, separate prin spaţii, cel mult 1000000 de


numere naturale, fiecare număr având cel mult 3 cifre. Scrieţi un program C++
care afişează pe ecran, separate prin câte un spaţiu, în ordine cresc ătoare,
toate numerele din fişier aflate între două valori date de la tastatur ă. Dac ă
fişierul nu conţine astfel de numere se va afişa pe ecran mesajul „NU EXISTA”.

Soluție: pentru a afișa în ordine numerele din fișier nu este necesar s ă sort ăm
șirul acestora. Vom utiliza, în schimb, un vector caracteristic pentru a num ăra
valorile din fișier.

#include <fstream>

#include <iostream>

using namespace std;

int main()
{
int f[1000], x, y, aux, i, gasit=0;
//initializez vectorul de frecventa, f
for(i=0;i<1000;i++)
f[i]=0;

//declar fisierul f si il deschid pentru extragere de date


ifstream fis("date.in");

//extrag numerele din fisier si incrementez pozitia corespunzatoare din

//vectorul de frecventa
while(fis>>x)
{
f[x]++;
}

//citesc capetele intervalului


cout<<"introduceti limitele de cautare !";
cin>>x>>y;

//verific daca prima limita e mai mare, caz in care le inversez


if(x>y)
{
aux=x;
x=y;
y=aux; }
//caut in f valorile diferite de zero ale caror indecsi au valori intre
x si y
for(i=x;i<=y;i++)
if(f[i]>0)
{
cout<<i<<' ';
gasit=1;
}

if(!gasit) cout<<"NU EXISTA";


fis.close();
return 0;}

1
2. Scrieţi un program C++ care citeşte de la tastură un număr natural n cu cel
mult 9 cifre şi care creează fişierul text date.out ce conţine num ărul n şi toate
prefixele nenule ale acestuia, pe o singură linie, separate prin câte un spa ţiu,
în ordine descrescătoare a valorii lor. Exemplu: pentru n=10305 fişierul
date.out va conţine numerele: 10305 1030 103 10 1.

Soluție:

#include <fstream>
#include <iostream>
using namespace std;
int main()
{
unsigned long n;
cin>>n;

//declar fisierul f si il deschid pentru scriere de date


ofstream fis("date.out");
while(n!=0)
{
//scriem in fiser numarul, apoi eliminam ultima cifra
fis<<n<<'\n';
n=n/10;
}
fis.close();
return 0;
}
3. Fișierul text.in conține un text format din diferite caractere. Se cere s ă se
creeze fișierul text.out, care să conțină doar cuvintele din text și spa țiile dintre
ele.

Soluție: utilizarea operatorilor de extracție nu este indicat ă în aceast ă situa ție,


deoarece, în mod implicit, aceștia omit spațiile albe. Vom folosi, de aceea,
metoda get().

#include <fstream>
#include <iostream>
using namespace std;
int main()
{
char c;
ifstream fin("text.in");
ofstream fout("text.out");
while(!fin.eof())
{
//extrag in variabila c un caracter, folosind metoda get pentru a nu
omite spatiile albe
fin.get(c);
if((c>='a') && (c<='z') || (c==' ') || (c>='A') && (c<='Z'))
fout<<c;}
fin.close();
fout.close();
return 0;
}

2
4. Fișierul date.in conține pe prima linie n, un număr întreg, iar pe linia
următoare n numere întregi. Se cere să se genereze fișierul date.out care s ă
conțină toate permutările circulare ale șirului dat.

Soluție:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n,i,x,b[100],j=1,aux;
ifstream f("date.in");
ofstream g("date.out");
f>>n;
for(i=1;i<=n;i++)
f>>b[i];
for(i=1;i<=n;i++)
{
aux=b[1];
for(j=2;j<=n;j++)
b[j-1]=b[j];
b[n]=aux;

for(j=1;j<=n;j++)
g<<b[j]<<' ';
g<<endl;
}
return 0;
}
5. În fişierul numere.in pe prima linie este memorat un număr natural n
(n≤10000), iar pe linia următoare un şir de n numere naturale distincte dou ă
câte două, separate prin câte un spaţiu, cu maximum 4 cifre fiecare. Se cere
să se creeze fișierul numere.out care să conțină pentru fiecare dintre cele n
numere poziția pe care ar ocupa-o dacă șirul numerelor ar fi sortat cresc ător.
Exemplu: dacă fişierul numere.in conţine:
1. 6
267 13 45 628 7 79
Fișierul numere.out ar conține:
523614
Soluție:
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int nr[1000], poz[10000],i,j,n,sw;
ifstream fin("numere.in");
ofstream fout("numere.out");
fin>>n;
3
for(i=0;i<n;i++)
fin>>nr[i];
for(i=0;i<n;i++)
{
sw=0;
for(j=0;j<n;j++)
if(nr[i]>nr[j]) sw++;
poz[i]=sw;
}
for(i=0;i<n;i++)
fout<<poz[i]<<' ';
fin.close();
fout.close();
return 0;}

Se considera fisierul BAC.TXT ce contine un sir crescator cu cel mult un milion de numere naturale de
cel mult noua cifre fiecare, separate prin c�te un spatiu.
Sa se scrie un program C/C++ care, folosind un algoritm eficient din punct de vedere al memoriei
utilizate si al timpului de executare, citeste din fisier toti termenii sirului si afiseaza pe ecran, pe o
singura linie, fiecare termen distinct al sirului urmat de numarul de aparitii ale acestuia �n sir.
Valorile afisate sunt separate prin c�te un spatiu.
Exemplu: daca fisierul BAC.TXT are urmatorul continut:
1 1 1 5 5 5 5 9 9 11 20 20 20
programul va afisa:
1 3 5 4 9 2 11 1 20 3
deoarece 1 apare de 3 ori, 5 apare de 4 ori, etc.

#include<fstream>
using namespace std;
ifstream f("BAC.TXT");

int main()
{ long x,y,n;
f>>x;
n=1;
while(f>>y)
{ if(x==y) n++;
else { cout<<x<<" "<<n<<" ";
n=1;
}
x=y;
}
cout<<x<<" "<<n;
return 0;}
**************************************

#516.
Fisierul text bac.txt contine, pe o singura linie, cel mult 1000 de numere naturale nenule, numerele
fiind separate prin c�te un spatiu. Scrieti un program C/C++ care citeste de la tastatura un numar
natural nenul n si numerele din fisierul bac.txt si care afiseaza pe ecran, separate prin c�te un
spatiu, toate numerele din fisier care sunt divizibile cu n. Daca fisierul nu contine niciun astfel de
numar, atunci se va afisa pe ecran mesajul NU EXISTA.
Exemplu: daca fisierul bac.txt contine numerele: 3 100 40 70 25 5 80 6 3798,
pentru n=10 atunci pe ecran se va afisa: 100 40 70 80
4
#include<fstream>
using namespace std;
ifstream f("bac.txt");
int main()
{ int n,x,k=0;
cin>>n;
while(f>>x)
if(x%n==0) { cout<<x<<" ";
k++; }
if(k==0) cout<<"NU EXISTA";
return 0;}

https://lectiideticsiinfo.blogspot.com/p/probleme-c.html

Se citesc două numere naturale a și b (a mai mic decât b) având cel mult 9 cifre fiecare. Afișați câte numere din
intervalul [a,b] au exact 3 divizori.
Exemplu:
În intervalul [11,50] numerele care au exact 3 divizori sunt 25 și 49, deci se va afișa 2.

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int n=0,a,b;
cin>>a>>b;
int x=sqrt(a),y=sqrt(b);
if(sqrt(a)!=floor(sqrt(a))) x++;
for(int i=x;i<=y;i++)
{
int p=1;
if(i==0 || i==1) p=0;
else if(i%2==0 && i>2) p=0;
else for(int d=3;d*d<=i;d=d+2)
if(i%d==0) p=0;
if(p) n++;
}
cout<<n;
return 0;
}

5
Se citesc doua numere naturale a si b (a mai mic decat b). Afisati numerele din intervalul [a,b] care au
proprietatea ca au numar maxim de divizori primi.
Exemplu: a=30, b=45 => 30, 42 (au cate 3 divizori primi, iar restul numerelor au mai putini)

#include <iostream>

using namespace std;

int main()
{
int a,b,max=0;
cin>>a>>b;
for(int n=a;n<=b;n++)
{
int c=0;
int x=n,d=2;
while(x>1)
if(x%d==0)
{
c++;
while(x%d==0) x=x/d;
}
else d++;
if(c>max) max=c;
}
for(int n=a;n<=b;n++)
{
int c=0;
int x=n,d=2;
while(x>1)
if(x%d==0)
{
c++;
while(x%d==0) x=x/d;
}

6
else d++;
if(c==max) cout<<n<<" ";
}
return 0;
}

Se citeste un numar natural n. Afisati factorul prim care apare la puterea cea mai mare in descompunerea
in factori primi a lui n.
Daca mai multi factori apar ca acea putere maxima, atunci se va afisa cel mai mare dintre ei.
Exemplu: n=36 => 3 (din 2 la 2 si 3 la 2), iar n=40 =>2 (din 2 la 3 si 5 la 1)

#include <iostream>
using namespace std;

int main()
{
int n,d=2,emax=1,dmax;
cin>>n;
while(n>1)
if(n%d==0)
{
int e=0;
while(n%d==0) {e++; n=n/d;}
if(e>=emax) {emax=e; dmax=d;}
}
else d++;
cout<<dmax;
return 0;
}

Se citesc numere naturale p�n� c�nd se introduce num�rul 0. Afisati suma obtinut� prin adunarea
numerelor formate din primele dou� cifre ale numerelor citite. Numerele cu mai putin de 2 cifre nu se iau
in considerare.
Exemplu: dac� se introduc numerele 3455 66 7 8 22 11221 0 atunci se va afisa 133(=34+66+22+11)

#include <iostream>

using namespace std;

7
int main()
{
int n,s=0;
cin>>n;
while(n!=0)
{
if(n>9) //daca numarul are cel putin doua cifre
{
while(n>99) n=n/10; //tai cifrele inafara de primele soua
s=s+n;
}
cin>>n;
}
cout<<s;
return 0;}

Se citesc dou� numere naturale a si b. Afisati num�rul care are suma maxim� a exponentilor din
descompunerea in factori primi. Daca ambele numere au aceeasi sum� a exponentilor, atunci se va afisa
oricare dintre ele.
Exemplu: pentru a=36, b=30 se va afisa 36 (36=2 la 2 * 3 la 2 , deci suma e 4, iar 30=2*3*5, deci suma e 3)

#include <iostream>

using namespace std;

int main()
{
int a,b,x,sea=0,seb=0;
cin>>a>>b;
x=a;
int d=2;
while(x>1) //descompun factori primi
if(x%d==0)
{
sea++; //numar factorii (in total vor fi suma exponentilor)
x=x/d;
}
else d++;
x=b;
d=2;
while(x>1)
if(x%d==0)
{
seb++;
x=x/d;
}
else d++;
if(sea>seb) cout<<a;
else cout<<b;
return 0;
8
}

Se citesc dou� numere naturale a si b. Afisati num�rul care are cei mai multi factori primi. Daca ambele numere
au acelasi num�r de factori primi, atunci se va afisa oricare dintre ele.
Exemplu: pentru a=36, b=30 se va afisa 30 (30 are 3 factori primi: 2,3,5, iar 36 doar 2: 2 si 3)

#include <iostream>

using namespace std;

int main()
{
int a,b,x,nfa=0,nfb=0;
cin>>a>>b;
x=a;
int d=2;
while(x>1) //descompun in factori primi pe a (x)
if(x%d==0)
{
nfa++;//numar factorul prim
while(x%d==0) x=x/d; //elimin multiplii lui
}
else d++;
x=b;
d=2;
while(x>1)
if(x%d==0)
{
nfb++;
while(x%d==0) x=x/d;
}
else d++;
if(nfa>nfb) cout<<a;
else cout<<b;
return 0;
9
}

Se da un interval [a,b]. Afisati cate dintre numerele din intervalul [a,b] au proprietatea ca atat ele cat si
rasturnatul lor sunt patrate perfecte (ex: 144 si 441). Se cere un algoritm eficient din punct de vederea al
timpului de executie.
Exemplu: pentru intervalul [100,1000] sunt 10 astfel de numere.

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int a,b, x, r,k=0;
cin>>a>>b;
for(int i=sqrt(a);i<=sqrt(b);i++)
{
x=i*i; r=0;
while(x>0)
{
r=r*10+x%10;
x=x/10;
}
if(sqrt(r)==floor(sqrt(r))) k++;
}
cout<<k;
return 0;
}

hhhhhhhhh

10

S-ar putea să vă placă și