Upload
raluca-ralux-manea
View
24
Download
1
Embed Size (px)
DESCRIPTION
UBB Cluj
Citation preview
1
/*
* Subi3Var1.cpp
*
* Created on: Mar 27, 2013
* Author: Vasile Cioban
*/
//
============================================================================================
====
//Se citeste un sir de numere naturale nenule. Sa se scrie un program care elimina din X secventele
//X[i],...X[i+l] formate din numere asemenea si formeaza un sir R cu numerele "distincte" eliminate.
//Spunem ca doua numere naturale sunt asemenea daca scrierile celor doua numere
//(in baza 10) au aceleasi cifre (Ex.: 13133, 31 si 3311 SUNT asemenea,
//iar 123 si 6132 NU sunt asemenea). La sfarsit se cere tiparirea sirurilor X si R.
//
//Exemple
//Pentru sirul X = (15, 1316, 613, 1316, 4, 58, 85, 885) se va tipari
//X = (15, 4) si R = (1316, 613, 58, 85, 885)
//Pentru sirul X = (45, 4, 58, 853, 39) se va tipari
//X = (45, 4, 58, 853, 39) si 'R este sirul vid'
//===========================================================================================
/* daca A asemenea cu B si B asemenea cu C atunci si A asemenea cu C (tranzitivitate)
* e suficient sa vedem daca doua elemente alaturate x[i] si X[i+1] sunt asemenea,
* si se poate parcurge secventa X o sigura data
* algoritmul general in Pseudocod (prima versiune) este:
*
algoritmul general in Pseudocod (prima versiune) este:
i <-1
start <-1 // indicele de start al unei secvente de numere asemenea
CatTimp i<= n-1 executa
Daca Asemenea(x[i],X[i+1])
atunci // suntem intr-o secventa de numere asemenea
Daca i=n-1 // la sfarsitul verificarii lui X
// daca X se termina cu o secventa de numere
// asemenea
atunci
@ muta X[start]...X[n] in R (duplicatele nu se muta)
@ se sterge X[start]...X[n] din X
SfDaca
i <- i+1
altfel // X[i] si X[i+1] nu sunt asemenea
Daca (i>1 si Asemenea(X[i-1],X[i])
2
atunci // secventa X[start]...X[i] contine nr asemenea
@ muta X[start]...X[i] in R (duplicatele nu se muta)
@ se sterge X[start]...X[i] din X
i<-start // trebuie pornit cu i-ul de la start
altfel // X[i] si X[i+1] nu sunt asemenea si X[i] nu
// face parte dintr-o secventa anterioara de
// numere asemenea
start <- start +1 // o eventuala secventa are
// inceputul pe urmatoare pozitie
i <- i+1 // trecem la pozitia urmatoare de verificat
SfDaca
SfDaca
SfCatTimp
*/
#include<iostream>
using namespace std;
int AinB (long a, long b)//returneaza 1 daca cifrele lui a sunt incluse in cifrele lui b
{
//returneaza 0 in caz contrar
long bBak=b; //bBak retine valoarea initiala a lui b
unsigned UCifa; //UCifa retine ultima cifra din a
while (a>0)
{
b =bBak; //refacem valoarea lui b
UCifa=a % 10;
while (b>0 && (UCifa !=(b % 10))) //comparam UCa cu fiecare cifra din b
b=b/10;
if(b==0) return 0; //daca b e 0 atunci o cifra a lui a nu e printre cifrele lui b
a=a/10; //se elimina ultima cifra a lui a
}
return 1; //iesirea din ciclu inseamna ca a < b
}
int Asemenea(long a, long b)
{
if(AinB(a,b) && AinB(b,a)) return 1;
return 0;
}
3
void CitSecv(int &n, long X[])
{
cout<<"da lungime secventa:";
cin >>n;
for(int i=1; i<=n; i++)
{
cout<<"da un element:";
cin >>X[i];
}
}
void AfisSecv(int n, long X[])
{
if (n>0)
for(int i=1; i<=n; i++)
cout<<X[i]<<" ";
else cout<<"secventa este vida";
}
int ExistaInR(long a, int m, long R[])
{
for(int i=1; i<=m; i++)
if (a==R[i]) return 1; //mai exista in R
return 0;
}
void MutaInR (int start,int i, int n, long X[], int& m, long R[])
{
int k=start;
while (k<=i)
{
if (!ExistaInR(X[k],m,R))
{
m++;
R[m]=X[k];
}
k++;
}
}
void StergeDinX(int start,int i,int &n,long X[])
{
int dif=i-start+1;
int k=start;
while (k+dif<=n)
{
X[k]=X[k+dif];
4
k++;
}
n=n-dif;
}
void StergeAsemenea (int &n, long X[], int& m, long R[])
{
// m indice pentru tabloul R
int i,start; // n dimensiunea lui X
m =0;
i =1;
start=1; // indicele de start al unei secvente de numere asemenea
while (i<=(n-1))
{
if(Asemenea(X[i],X[i+1]))
{
// suntem intr-o secventa de numere asemenea
if(i==(n-1)) // la sfarsitul verificarii lui X (daca X se termina cu
{
// o secventa de numere asemenea)
MutaInR (start,n,n,X,m,R);// muta X[start]...X[n] in R (duplicatele nu se muta)
StergeDinX (start,n,n,X); // se sterge X [start]...X[n] din X
}
i++;
}
else // X[i] si X[i+1] nu sunt asemenea
if(i>1 && Asemenea(X[i-1],X[i]))
{
// secventa X[start]...X[i] contine nr asemenea
MutaInR (start,i,n,X,m,R);// muta X[start]...X[i] in R (duplicatele nu se muta)
StergeDinX(start,i,n,X); // se sterge X[start]...X[i] din X
i=start;
}
else // X[i] si X[i+1] nu sunt asemenea si X[i] nu face
// parte dintr-o secventa anterioara de numere asemenea
{
start++; // o eventuala secventa are inceputul pe urmatoare pozitie
i++; // trecem la pozitia urmatoare de verificat
}
}
}
5
int main(void)
{
long X[50],R[50]; //X tabloul initial, n lungimea lui
int n,m; //R tabloul cu numere asemenea, m Lungimea lui
CitSecv (n,X);
cout <<"secventa initiala:";
AfisSecv (n,X);
StergeAsemenea(n,X,m,R);
cout <<endl<<"X:";
AfisSecv (n,X);
cout <<endl<<"R:";
AfisSecv (m,R);
cout <<endl<<"program terminat"<<endl;
return 0;
}
//
============================================================================================
====
//Se citeĹte un Ĺir de numere naturale nenule. SÄ se scrie un program care eliminÄ din X secvenĹŁele� � � �//formate din numere asemenea Ĺi formeazÄ un Ĺir R cu numerele distincte eliminate.� � �//Spunem ca douÄ numere naturale sunt asemenea daca scrierile celor douÄ numere� �//(ĂŽn baza 10) au aceleaĹi cifre (Ex.: 13133, 31 Ĺi 3311 SUNT asemenea,� �//iar 123 Ĺi 6132 NU sunt asemenea). La sfârĹit se cere tipÄrirea sirurilor X Ĺi R.� � � �//
//Exemple
//Pentru Ĺirul X = (15, 1316, 613, 1316, 4, 58, 85, 885) se va tipÄri� �//X = (15, 4) Ĺi R = (1316, 613, 58, 85, 885)�//Pentru Ĺirul X = (45, 4, 58, 853, 39) se va tipÄri� �//X = (45, 4, 58, 853, 39) Ĺi âR este Ĺirul vidâ� � � � ��//===========================================================================================
/*
* Subi3.cpp
*
* Created on: Mar 22, 2013
* Author: Vasile Cioban
*/
#include<iostream>
using namespace std;
6
/* Descriere: Verifica daca cifrele lui a sunt incluse in cifrele lui b
* Date&Prec: a,b doua numere naturale
* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar
*/
int AinB (long a, long b) //returneaza 1 daca cifrele lui a sunt incluse in cifrele lui b
{ //returneaza 0 in caz contrar
long bBak=b; //bBak retine valoarea initiala a lui b
unsigned UCa; //UCa retine ultima cifra din a
while (a>0)
{ b =bBak; //refacem valoarea lui b
UCa=a % 10;
while (b>0 && (UCa !=(b % 10))) //comparam UCa cu fiecare cifra din b
b=b/10;
if(b==0) return 0; //daca b e 0 atunci o cifra a lui a nu e printre cifrele lui b
a=a/10; //se elimina ultima cifra a lui a
}
return 1; //iesirea din ciclu inseamna ca a < b
}
/* Descriere: Verifica a si b au aceleasi cifre
* Date&Prec: a,b doua numere naturale
* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar
*/
int Asemenea(long a, long b)
{ if(AinB(a,b) && AinB(b,a)) return 1; // se verifica daca cifrele lui a sunt printe cifrele lui b si
return 0; // daca cifrele lui b sunt printre cifrele lui a
}
/* Descriere: citire secventa numere
* Date&Prec: -
* Rezultate&PostC: n natural, X[1],..X[n] numere naturale
*/
void CitSecv(int &n, long X[])
{ cout<<"da lungime secventa:";
cin >>n;
for(int i=1; i<=n;i++)
{ cout<<"da un element:";
cin >>X[i];
}
}
/* Descriere: afiseaza o secventa de numere naturale
7
* Date&Prec: n natural, X[1],..X[n] numere naturale
* Rezultate&PostC: -
*/
void AfisSecv(int n, long X[])
{ if (n>0)
for(int i=1;i<=n;i++)
cout<<X[i]<<" ";
else cout<<"secventa este vida";
}
/* Descriere: verifica daca un numar este intr-o secventa
* Date&Prec: a natural, n natural, X[1],..X[n] numere naturale
* Rezultate&PostC: -returneaza 1 daca a este in X si 0 altfel
*/
int ExistaInR(long a, int m, long R[])
{ for(int i=1;i<=m;i++)
if (a==R[i]) return 1; //mai exista in R
return 0;
}
/* Descriere: elimina elemente dintr-o secventa
* Date&Prec: i,l naturale (indicele de inceput si numarul de elemente eliminate)
* n natural, X[1],..X[n] numere naturale
* Rezultate&PostC: X, cu l elemente inlaturate de pe pozitia i, n micsorat cu l elemente
*/
void EliminaElem(int i,int l,int &n,long X[])
{ for(int k=i;k<=n-l;k++)
X[k]=X[k+l];
n-=l;
}
/* Descriere: rezolvarea cerintei problemei
* Date&Prec: n natural, X[1],...,X[n] numere naturale
* Rezultate&PostC: n natural, X[1],...,X[n] contine numere care nu sunt asemenea
* m natural, R[1],...,X[m] contine secevnte de numere asemenea fara duplicate.
*/
void EliminaAsemenea (int &n, long X[], int& m, long R[])
{ // m indice pentru tabloul R
int i; // i indicele lui X
m =0;
i =1;
while (i<n)
{ if(Asemenea(X[i],X[i+1])) // daca X[i] si X[i+1] sunt asemenea
{if (!ExistaInR (X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]
8
if (!ExistaInR (X[i+1],m,R)) R[++m]=X[i+1];// adaug in R pe X[i+1]
EliminaElem(i,2,n,X); // elimina subsirul X[i],X[i+1] din X
}
else // X[i] si X[i+1] nu sunt asemenea
{if(Asemenea(X[i],R[m])) // daca X[i] e asemenea cu ultimul din R (deci cu R[m])
{if(!ExistaInR(X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]
EliminaElem(i,1,n,X); // elimina pe X[i] din X
}
else i++; // daca X[i] nu este asemenea cu R[m] atunci trec la urmatorul
}
}
if(Asemenea(X[n],R[m])) // verificare pentru ultimul element
{if(!ExistaInR (X[n],m,R))
R[++m]=X[n];
EliminaElem(i,1,n,X);
}
}
int main(void)
{ long X[100],R[100]; //X tabloul initial, n lungimea lui
int n,m; //R tabloul cu asemenea, m Lungimea lui
CitSecv (n,X);
cout <<"secventa initiala:";
AfisSecv ( n,X);
EliminaAsemenea(n,X,m,R);
cout <<endl<<"X:";
AfisSecv (n,X);
cout <<endl<<"R:";
AfisSecv (m,R);
cout <<endl<<"program terminat"<<endl;
return 0;
}
9
//
============================================================================================
====
//Se citeĹte un Ĺir X de numere naturale nenule. SÄ se scrie un program care eliminÄ din X secvenĹŁele� � � �//formate din numere asemenea Ĺi formeazÄ un Ĺir R cu numerele distincte eliminate.� � �//Spunem ca douÄ numere naturale sunt asemenea daca scrierile celor douÄ numere� �//(ĂŽn baza 10) au aceleaĹi cifre (Ex.: 13133, 31 Ĺi 3311 SUNT asemenea,� �//iar 123 Ĺi 6132 NU sunt asemenea). La sfârĹit se cere tipÄrirea sirurilor X Ĺi R.� � � �//
//Exemple
//Pentru Ĺirul X = (15, 1316, 613, 1316, 4, 58, 85, 885, 1316, 613, 1316) se va tipÄri� �//X = (15, 4) Ĺi R = (1316, 613, 58, 85, 885)�//Pentru Ĺirul X = (45, 4, 58, 853, 39) se va tipÄri� �//X = (45, 4, 58, 853, 39) Ĺi âR este Ĺirul vidâ� � � � ��//===========================================================================================
/*
* Subi3.cpp
*
* Created on: Mar 22, 2013
* Author: Vasile Cioban
*/
#include<iostream>
using namespace std;
/* Descriere: Verifica daca cifrele lui a sunt incluse in cifrele lui b
* Date&Prec: a,b doua numere naturale
* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar
*/
int AinB (long a, long b)//returneaza 1 daca cifrele lui a sunt incluse in cifrele lui b
{ //returneaza 0 in caz contrar
long bBak=b; //bBak retine valoarea initiala a lui b
unsigned UCa; //UCa retine ultima cifra din a
while (a>0)
{ b =bBak; //refacem valoarea lui b
UCa=a % 10;
while (b>0 && (UCa !=(b % 10))) //comparam UCa cu fiecare cifra din b
b=b/10;
10
if(b==0) return 0; //daca b e 0 atunci o cifra a lui a nu e printre cifrele lui b
a=a/10; //se elimina ultima cifra a lui a
}
return 1; //iesirea din ciclu inseamna ca a < b
}
/* Descriere: Verifica a si b au aceleasi cifre
* Date&Prec: a,b doua numere naturale
* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar
*/
int Asemenea(long a, long b)
{ if(AinB(a,b) && AinB(b,a)) return 1; // se verifica daca cifrele lui a sunt printe cifrele lui b si
return 0; // daca cifrele lui b sunt printre cifrele lui a
}
/* Descriere: citire secventa numere
* Date&Prec: -
* Rezultate&PostC: n natural, X[1],..X[n] numere naturale
*/
void CitSecv(int &n, long X[])
{ cout<<"da lungime secventa:";
cin >>n;
for(int i=1; i<=n;i++)
{ cout<<"da un element:";
cin >>X[i];
}
}
/* Descriere: afiseaza o secventa de numere naturale
* Date&Prec: n natural, X[1],..X[n] numere naturale
* Rezultate&PostC: -
*/
void AfisSecv(int n, long X[])
{ if (n>0)
for(int i=1;i<=n;i++)
cout<<X[i]<<" ";
else cout<<"secventa este vida";
}
/* Descriere: verifica daca un numar este intr-o secevnta
* Date&Prec: a natural, n natural, X[1],..X[n] numere naturale
* Rezultate&PostC: -returneaza 1 daca a este in X si 0 altfel
*/
int ExistaInR(long a, int m, long R[])
11
{ for(int i=1;i<=m;i++)
if (a==R[i]) return 1; //mai exista in R
return 0;
}
/* Descriere: elimina elemente dintr-o secventa
* Date&Prec: i,l naturale (indicele de inceput si numarul de elemente eliminate)
* n natural, X[1],..X[n] numere naturale
* Rezultate&PostC: X, cu l elemente inlaturate de pe pozitia i, n micsorat cu l elemente
*/
void EliminaElem(int i,int l,int &n,long X[])
{ for(int k=i;k<=n-l;k++)
X[k]=X[k+l];
n-=l;
}
/* Descriere: rezolvarea cerintei problemei
* Date&Prec: n natural, X[1],...,X[n] numere naturale
* Rezultate&PostC: n natural, X[1],...,X[n] contine numere care nu sunt asemenea
* m natural, R[1],...,X[m] contine secevnte de numere asemenea fara duplicate.
*/
void EliminaAsemenea (int &n, long X[], int& m, long R[])
{ // m indice pentru tabloul R
int i; // i indicele lui X
m =0;
i =1;
while (i<n)
{ if(Asemenea(X[i],X[i+1])) // daca X[i] si X[i+1] sunt asemenea
{if (!ExistaInR (X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]
if (!ExistaInR (X[i+1],m,R)) R[++m]=X[i+1];// adaug in R pe X[i+1]
EliminaElem(i,2,n,X); // elimina subsirul X[i],X[i+1] din X
}
else // X[i] si X[i+1] nu sunt asemenea
{if(Asemenea(X[i],R[m])) // daca X[i] e asemenea cu ultimul din R (deci cu R[m])
{if(!ExistaInR(X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]
EliminaElem(i,1,n,X); // elimina pe X[i] din X
}
else i++; // daca X[i] nu este asemenea cu R[m] atunci trec la urmatorul
}
}
if(Asemenea(X[n],R[m])) // verificare pentru ultimul element
{if(!ExistaInR (X[n],m,R))
R[++m]=X[n];
12
EliminaElem(i,1,n,X);
}
}
int main(void)
{ long X[100],R[100]; //X tabloul initial, n lungimea lui
int n,m; //R tabloul cu asemenea, m Lungimea lui
CitSecv (n,X);
cout <<"secventa initiala:";
AfisSecv (n,X);
EliminaAsemenea(n,X,m,R);
cout <<endl<<"X:";
AfisSecv (n,X);
cout <<endl<<"R:";
AfisSecv (m,R);
cout <<endl<<"program terminat"<<endl;
return 0;
}
#include <iostream>
using namespace std;
typedef struct{
int val[100];
int fr [100];
int dim;
} Perechi;
typedef struct{
int val[100];
int dim;
} SecVenta;
int Prim(int n){ //returneza 1 daca n e prim si 0 daca n nu e prim
int d=2;
if(n<2) return 0;
while (d*d<=n && n%d!=0)
if(d==2) d=3;
else d=d+2;
13
if(d*d>n) return 1; //numarul e prim
else return 0;
}
int SumaCif(int n){
int S=0;
while(n>0){
S=S+n%10;
n/=10;
}
return S;
}
void Citire(SecVenta& X){
int temp;
X.dim=0;
do{
cout<<"da un numar:";
cin >>temp;
if(temp!=0){
X.dim++;
X.val[X.dim]=temp;
}
} while (temp>0);
}
void AfisareX(SecVenta X){
int DimX;
DimX=X.dim;
for(int i=1; i<=DimX; i++){
cout<<X.val[i]<<" ";
if(i%10==0) cout<<endl;
}
}
void AfisareY(Perechi Y){
int DimY;
DimY=Y.dim;
cout<<endl;
if(DimY)
for(int i=1; i<=DimY; i++){
cout<<"("<<Y.val[i]<<","<<Y.fr[i]<<"),";
if(i%10==0) cout<<endl;
}
else cout<<"nu exista niciiun numar cerut";
}
14
int Exista(Perechi Y, int v){
int i,DimY;
DimY=Y.dim;
i=1;
while(i<=DimY && Y.val[i]!=v) i++;
if(i>DimY) return 0; // daca nu exista v in Y retur 0
return i; // daca exista v in Y retur pozitia
}
void Insert(Perechi& Y, int val){
int DimY=Y.dim;
int i=DimY;
while(i>0 && val<Y.val[i]){
Y.val[i+1]=Y.val[i];
Y.fr[i+1] =Y.fr [i];
i--;
}
Y.val[i+1]=val;
Y.fr [i+1]=1;
Y.dim++;
}
void CreYY(SecVenta X, Perechi& Y){
int DimX=X.dim;
Y.dim=0;
for(int i=1;i<=DimX;i++)
if(Prim(SumaCif(X.val[i])))
{ int poz=Exista(Y,X.val[i]);
if(poz==0) Insert(Y,X.val[i]);
else Y.fr [poz]++;
}
}
int main(){
Perechi Y;
SecVenta X;
Citire (X);
AfisareX (X);
CreYY (X,Y);
AfisareY (Y);
cout <<"\nprogram terminat";
return 0;
}
15
#include <iostream>
#include <fstream>
using namespace std;
int PrimaCif(int n){
while (n>10) n=n/10;
return n;
}
int UltimaCif(int n){
return n%10;
}
int MaxCif(int n){
int Max=-1;
int cif;
while(n>0){
cif=n%10;
if(cif>Max) Max=cif;
n=n/10;
}
return Max;
}
void CreMat(int n, int x[],int a[20][20])
{ for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{ if(i+j<n+1) a[i][j]=UltimaCif(x[n*n+i+j]);
if(i+j>n+1) a[i][j]=PrimaCif (x[n*n+i+j]);
if(i+j==n+1)a[i][j]=MaxCif (x[n*n+i*i]);
}
}
void CreSir(int n, int x[])
{ int N,i,d; // N pentru numarul natural curent
// i indice pentru tabloul x;
// d pentru divizorii lui j
N=i=1;
while (i<=2*n*n){
x[i]=N;
16
d=2;
while(i<=2*n*n && d<=N/2){
if(N%d==0) x[++i]=d;
d++;
}
N++;
i++;
}
return;
}
void Afisare(int n, int x[]){
ofstream g("Sir.out");
for(int i=1; i<=2*n*n;i++ )
{g<<x[i]<<" ";
if(i%20==0) g<<endl;
}
g.close();
}
void AfisareMat(int n, int A[20][20]){
ofstream g("Sir.out2");
for(int i=1; i<=n;i++ )
{for(int j=1;j<=n;j++)
g<<A[i][j]<<" ";
g<<endl;
}
g.close();
}
void AfisareZec(int n, int A[20][20]){
int Max,cif;
for(int j=1; j<=n;j++ )
{ Max=0;
for(cif=9;cif>=0;cif--)
{ for(int i=1;i<=n;i++)
if(cif==A[i][j])Max=Max*10+A[i][j];
}
cout<<Max<<",";
}
}
17
int main()
{ int n=4;
int x[100],A[20][20];
CreSir(n,x);
Afisare(n,x);
CreMat(n,x,A);
AfisareMat(n,A);
AfisareZec(n,A);
return 0;
}
//Doua numere naturale a si b se numesc asemanatoare daca în
//scrierea lor în baza 10 au cel putin o cifra comuna.
//Se citesc mai multe siruri de numere naturale (un sir
//se termina la citirea unui numar negativ),
//iar sirurile se termina cu sirul vid.
//Pentru fiecare sir citit sa se tipareasca cea mai lunga
//secventa de elemente consecutive formata numai din numere asemanatoare
#include<iostream>
using namespace std;
/*
Descriere: citeste de la tastatura un sir de numere naturale
Rezultate: numarul de elemente a sirului(fara numarul negativ), elemtele sirului(fara cel negativ)
*/
void citesteSir(int a[], int &n)
{
n=0; //n va fi folosit pt pozitioonarea in sir si pentru numararea numarului de elemente
while(a[n]>=0) // se citeste pana la intalnirea unui elem negativ
{ n++; //n se incrementeaza pt a se trece la pozitia urm si pt a sti numarul exact de elemente
cin>>a[n];
}
n--; // n scade cu 1, deoarece pe ultima pozitie se afla elementul negativ
}
/*
Descriere:verifica daca 2 numere au vreo cifra asemenea
Date de intrare:Numerele a si b
Rezultate: 1 la intalnirea primei cifre asemenea; 0 la eliminarea tuturor cifrelor din ambele numere
*/
int Asemenea(int a, int b) //variabilele a si b sunt cele ale caror cifre sunt verificate
{ int c; // variabila c va fi folosita in verificare, pt ca sa nu se piarda numarul b
18
while(a!=0) // se verifica atat timp cat exista cifre in a
{ c=b;
while(c!=0) //c(copia numarului b) este cautata de cifre asemenea
if(a%10==c%10) // se compara ultima cifra din a cu ultima cifra din c
return 1; // se returneaza 1 daca s-au gasit cifre asemenea si se iese din functie
else
c/=10; // altfel, ultima cifra din c este eliminata
a/=10;
}
return 0; // se returneaza 0 daca nu exista cifre asemenea
}
/*
Descriere: Functia cauta cea mai lunga secventa de numere asemenea; secventa este pusa in sirul b
Date de intrare: Sirul a( care este cautat de elem asemenea), numarul sau de elemente,
sirul b in care se va pune secventa si numarul sau de elemente
Rezultate:Sirul b ce cea mai lunga secventa si numarul sau de elemente
*/
void CautSecventa(int a[], int n, int b[], int &m)
{ int i,c,maxst,maxdr;
//variabilele maxst, maxdr vor fi folosite pt a memora
//unde incepe si unde se termina fiecare secventa,
// iar contorul c, pt a numara elementele asemenea din fiecare secventa
int ms,md,mc=0;
//variabilele ms si md vor fi folosite pe a unde incepe si
//unde se termina cea mai lunga secventa
// iar contorul mc pt a memora numarul de elemente din cea mai lunga secventa
for(i=1;i<n;i++)
if(Asemenea(a[i],a[i+1])) //se verifica daca elementul de pe pozitia i este asemenea cu cel de pe
//pozitia urmatoare
{ maxst=i;c=1; //daca elem sunt asemena, atunci maxst memoreaza pozitia primului element asemenea
//iar c va fi folosit pt numararea acestora
while(Asemenea(a[i],a[i+1])) //se parcurge sirul in continuare atat timp cat exista numere asemena alaturate
{i++; c++;}
maxdr=i; // maxdr retine pozitia ultimului element asemenea
if(c>mc) // este comparat numarul de elemente asemenea maxim cu cel din ultima parcurgere facuta
{ //daca este mai mare, atunci mc primeste valoarea lui c, iar ms si md cea a lui maxst si maxdr
mc=c; ms=maxst; md=maxdr;
}
}
m=0; // m primeste valoarea 0 pt a se numara nr de elemete din cea mai lunga secventa
for(i=ms;i<=md;i++) // se pune in sirul b cea mai lunga secventa de elemente asemenea
{
m++; b[m]=a[i];
19
}
}
/*
Descriere: Functia afiseaza un sir cu n elemente, punand spatii intre fiecare elemet
Date de intrare: siru si numarul sau de elemete
Rezultate:Afisarea sirului
*/
void AfisSecventa(int b[], int n)
{
for(int i=1;i<=n;i++) //variabila i va fi folosita pt parcurgerea in ordine a sirului, crescand cu 1 dupa fiecare afisare
cout<<b[i]<<" ";
}
int main()
{
int n,a[100],b[100],m;//n va fi numarul de elemente a sirului a, iar m va fi numarul de elemente a sirului b
//sirul a va contine numere naturale ce urmeaza sa fie verificate
//com folosi sirul b pt a aafisa secventa de elem asemenea
citesteSir(a,n); // se apeleaza functia pt citirea sirului a
CautSecventa(a,n,b,m);// se apeleaza functia pt aflarea celei mai lungi secvente de elemente asemenea
AfisSecventa(b,m); // se afiseaza sirul b ce contine cea mai lunga secventa de elemnte asemenea
return 0;
}