#include <iostream> using namespace std; int main() { unsigned n,ok=1,f=2,p; cin>>n; while(n!=1&&ok==1) { p=0; while(n%f==0) { n=n/f; ++p; } if(p%2!=0)ok=0; ++f; } if(ok==1)cout<<"da"; else cout<<"nu"; return 0; }
verificari
Operații cu mulțimi (1/5): verificare
Pentru a verifica dacă un vector este o mulțime, trebuie să verificăm dacă există sau nu doi termeni egali între ei. Dacă da, atunci vectorul nu este o mulțime.
#include <iostream> using namespace std; int main() { unsigned v[101],n,i,j,ok=1; cin>>n; for(i=1;i<=n;++i)cin>>v[i]; for(i=1;i<=n-1&&ok==1;++i) for(j=i+1;j<=n&&ok==1;++j) if(v[i]==v[j])ok=0; if(ok==1)cout<<"Vectorul este o multime."; else cout<<"Vectorul nu este o multime."; return 0; }
Căutarea binară
Căutarea binară a unui număr într-un vector constă în verificarea egalității dintre acel număr și termenul de la mijlocul vectorului. Pentru ca acest tip de căutare să funcționeze este important ca termenii vectorului să respecte o anumită regulă (să fie ordonați). Dacă are loc egalitate, înseamnă că am găsit numărul. Dacă nu, îl vom căuta fie în partea dreaptă a vectorului, fie în partea stângă (se determină partea prin compararea numărului cu mijlocul). Dacă vectorul are n termeni, atunci numărul maxim de pași efectuați va fi log2(n).
De exemplu, programul următor caută numărul x într-un vector ordonat crescător prin căutarea binară.
(Căutarea binară presupune eliminare de secvențe. Variabila st va reprezenta poziția capătului stâng al secvenței în care căutăm numărul, iar dr va fi poziția capătului drept al acestei secvențe. m=(st+dr)/2 va fi deci poziția termenui din mijloc.)
#include <iostream> using namespace std; int main() { unsigned v[101],n,ok=0,x,st=1,dr,m,i; cin>>x>>n; dr=n; for(i=1;i<=n;++i)cin>>v[i]; while(ok==0&&st<=dr) { m=(st+dr)/2; if(v[m]==x)ok=1; else if(v[m]>x)dr=m-1; else st=m+1; } if(ok==0)cout<<"Numarul "<<x<<" nu exista in vector."; else cout<<"Numarul "<<x<<" exista in vector."; return 0; }
Se poate spune despre căutarea binară că folosește metoda Divide et Impera.
Căutarea secvențială
Căutarea secvențială a unui număr într-un vector constă în compararea fiecărui termen al vectorului cu acel număr, iar când are loc egalitate înseamnă că am găsit numărul în vector. Dacă vectorul are n termeni, atunci numărul maxim de pași efectuați va fi n.
Programul următor caută un număr x într-un vector prin căutarea secvențială.
#include <iostream> using namespace std; int main() { unsigned v[101],n,i,ok=0,x; cin>>x>>n; for(i=1;i<=n&&ok==0;++i) { cin>>v[i]; if(v[i]==x)ok=1; } if(ok==0)cout<<"Numarul "<<x<<" nu exista in vector."; else cout<<"Numarul "<<x<<" exista in vector."; return 0; }
Verificare – numere prime între ele
Pentru a verifica dacă 2 numere sunt prime între ele, trebuie să vedem dacă cel mai mare divizor comun al lor este 1. Dacă da, atunci ele sunt prime între ele.
C++
#include using namespace std; int main() { unsigned x,y,r; cin>>x>>y; r=x%y; while(x*y!=0) { x=y; y=r; r=x%y; } if(y==1)cout<<"DA"; else cout<<"NU"; return 0; }
Verificări (cifre egale, ordine crescătoare şi descrescătoare, munte şi vale, ∃ şi ∀)
Verificările se realizează cu ajutorul unei variabile egale cu 0 în cazul negaţiei sau 1 în caz contrar.
1.Cifre egale
Pentru a verifica dacă un număr are toate cifrele egale, vom folosi o variabilă egală cu ultima cifră a numărului, apoi vom compara fiecare cifră rămasă cu aceasta. Presupunem că toate sunt egale cu ajutorul unei variabile egale cu 1, iar dacă se găseşte o cifră care nu este egală cu ultima cifră, acea variabilă va deveni 0.
Algoritmul în C++
#include
using namespace std;
int main()
{
unsigned n,c,ok=1;
cin>>n;
c=n%10;n=n/10;
while(n!=0)
{
if(n%10!=c)ok=0;
n=n/10;
}
if(ok==1)cout<<"DA";
else cout<<"NU";
}
2.Ordine crescătoare şi descrescătoare
Există 2 cazuri:
-verificaţi dacă cifrele unui număr se află în ordine crescătoare de la stânga la dreapta/descrescător de la dreapta la stânga.
În acest caz, va trebui de fapt să verificăm dacă cifra aflată la stânga de o cifră este mai mică decât aceasta.
Algoritmul în C++
#includ
using namespace std;
int main()
{
unsigned n,ok=1;
cin>>n;
while(n>9)
{
if(n/10%10>=n%10)ok=0;
n=n/10;
}
if(ok==1)cout<<"DA";
else cout<<"NU";
}
-verificaţi dacă cifrele unui număr se află descrescător de la stânga la dreapta/crescător de la dreapta la stânga
În acest caz singura diferenţă este că semnul “>=” din while devine “<="
if(n/10%10<=n%10)ok=0;
3.Munte şi vale
Faptul că un număr are aspect de munte înseamnă că acesta are cifrele de la stânga la dreapta crescătoare până la o anumită cifră, după care acestea sunt descrescătoare. De exemplu, 459421 are aspect de munte.
Algoritmul în C++
#include
using namespace std;
int main()
{
unsigned n,n1,ok=1;
cin>>n;
n1=n;
while(n>9&&n%10<n/10%10)n=n/10;
if(n==n1||n19&&n%10>n/10%10)n=n/10;
if(n>9)ok=0;
}
if(ok==1)cout<<"DA";
else cout<<"NU";
}
Faptul că un număr are aspect de vale înseamnă că acesta are cifrele de la stânga la dreapta descrescătoare până la o anumită cifră, după care acestea sunt crescătoare. De exemplu, 96478 are aspect vale.
Algoritmul în C++
#include
using namespace std;
int main()
{
unsigned n,n1,ok=1;
cin>>n;
n1=n;
while(n>9&&n%10>n/10%10)n=n/10;
if(n==n1||n19&&n%109)ok=0;
}
if(ok==1)cout<<"DA";
else cout<<"NU";
}
4.∃ şi ∀
-∃
Verificaţi dacă toate cifrele lui x sunt prime.
Algoritmul în C++
#include
using namespace std;
int main()
{
unsigned x,c,ok=1;
cin>>x;
while(x!=0)
{
c=x%10;x=x/10;
if(c!=2&&c!=3&&c!=5&&c!=7)ok=0;
}
if(ok==1)cout<<"DA";
else cout<<"NU";
}
-∀
Verificaţi dacă numărul x conţine cifre pare.
Algoritmul în C++
#include
using namespace std;
int main()
{
unsigned x,c,ok=0;
cin>>x;
while(x!=0)
{
c=x%10;x=x/10;
if(c%2==0)ok=1;
}
if(ok==1)cout<<"DA";
else cout<<"NU";
}