Eliminare de cifre în 2 paşi

Eliminarea de cifre se va realiza în 2 paşi cu ajutorul oglinditului. Astfel, când aflăm oglinditul, vom avea condiţia ca cifra să nu aibă o anumită proprietate pentru a nu fi eliminată. Apoi, vom oglindi oglinditul, pentru a obţine numărul cu cifrele în ordinea corectă.

Exemplu: Eliminaţi cifrele pare dintr-un număr n.

Algoritmul în C++

#include

using namespace std;

int main()
 {
 unsigned x,ogl=0,ogl1=0;
 cin>>x;
 while(x!=0)
 {
 if((x%10)%2!=0)ogl=ogl*10+x%10;
 x=x/10;
 }
 while(ogl!=0)
 {
 ogl1=ogl1*10+ogl%10;
 ogl=ogl/10;
 }
 cout<<ogl1;
 return 0;
 }

Oglinditul unui număr. Palindrom.

Oglinditul unui număr este un număr care conţine toate cifrele acelui număr în aceeaşi ordine, însă de la dreapta la stânga. De exemplu, oglinditul lui 178 este 871. El se obţine astfel:

Algoritmul în C++

#include

using namespace std;
int main()
{
unsigned x,ogl=0;
cin>>x;
while(x!=0)
{
ogl=ogl*10+x%10;
x=x/10;
}
cout<<ogl;
return 0;
}

Un palindrom este un număr egal cu oglinditul său. De exemplu, numărul 54345 are oglinditul 54345, cu care este egal, deci este un palindrom. Pentru a verifica dacă un număr este palindrom se va afla oglinditul, după care se va compara cu numărul iniţial.

Algoritmul în C++

#include

using namespace std;

int main()
{
unsigned x,ogl=0,x1;
cin>>x;
x1=x;
while(x1!=0)
{
ogl=ogl*10+x1%10;
x1=x1/10;
}
if(x==ogl)cout<<"Numarul este un palindrom";
else cout<<"Numarul nu este un palindrom";
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;
}

Cel mai mare divizor comun – Algoritmul lui Euclid

Prin acest algoritm, vom folosi o variabilă care va reprezenta restul primelor două numere. Primul număr îl va primi pe cel de-al doilea, cel de-al doilea va primi restul, iar restul se va calcula din nou. Acest lucru se continua până când restul este egal cu zero, iar valoarea finală a celui de-al doilea număr va fi cel mai mare divizor comun dintre cele două numere. Putem vedea ceea ce am explicat în exemplul următor, cu ajutorul unui tabel.

Calculaţi cel mai mare divizor comun dintre două numere naturale nenule.

x      y      r

30   45   30

45   30   15

30   15    0

15 (valoarea lui y) este cel mai mare divizor comun dintre x şi y.

C++

#include 

using namespace std;

int main()
 {
    unsigned x,y,r;
 cin>>x>>y;
 r=x%y;
 while(r!=0){
 x=y;
 y=r;
 r=x%y;
 }
 cout<<y;
 return 0;
 }

!!! Dacă numerele pot fi nenule, atunci se va folosi structura alternativă astfel:

if(x*y==0)cout<<x+y;
else

Instrucţiuni 2 vor fi reprezentate de ceea ce am scris la algoritmul anterior.

Cel mai mare divizor comun – scăderi repetate

Prin acest algoritm vom scădea numărul mai mic din numărul mai mare dintre primele două numere date, până când ele vor fi egale. Astfel, numărul obţinut va fi cel mai mare divizor comun dintre cele două numere. Putem vedea ceea ce am explicat în exemplul următor, cu ajutorul unui tabel.

Calculaţi cel mai mare divizor comun dintre două numere naturale nenule.

x      y

20   36

20   16

4     16

4     12

4      8

4      4

Cel mai mare divizor comun este 4.

C++

#include

using namespace std;

int main()
 {
 unsigned x,y;
 cin>>x>>y;
 while(x!=y)
 if(x>y)x=x-y;
 else(y>x)y=y-x;
 cout<<y;
 return 0;
 }

!!! Dacă numerele pot fi nenule, atunci se va folosi structura alternativă astfel:
if(x*y==0)cout<<x+y;
else

Instrucţiuni 2 vor fi reprezentate de ceea ce am scris la algoritmul anterior.

Simularea adunării, a scăderii, a înmulţirii

1.Simularea adunării

#include

using namespace std;

int main()
 {
 unsigned x,y,cx,cy,p,t,s,cs;
 cin>>x>>y;
 p=1;
 t=0;
 s=0;
 while(x!=0||y!=0)
 {
 cx=x%10;x=x/10;
 cy=y%10;y=y/10;
 cs=(cx+cy+t)%10;
 t=(cx+cy+t)/10;
 s=s+cs*p;
 p=p*10;
 }
 if(t>0)s=s+p;
 cout<<s;
 return 0;
 }

2.Simularea scăderii

#include

using namespace std;

int main()
 {
 unsigned x,y,cx,cy,cs,s=0,t=0,p=1;
 cin>>x>>y;
 while(x!=0||y!=0)
 {
 cx=x%10;x=x/10;
 cy=y%10;y=y/10;
 if(cx-t>=cy)
 {
 cs=cx-cy-t;
 t=0;
 }
 else
 {
 cs=cx-cy-t+10;
 t=1;
 }
 s=s+p*cs;
 p=p*10;
 }
 cout<<s;
 return 0;
 }

3.Simularea înmulţirii dintre un număr şi o cifră

#include

using namespace std;

int main()
 {
 unsigned a,x,cs,p=1,s=0,ca,t=0;
 cin>>a>>x;
 while(a>0)
 {
 ca=a%10;a=a/10;
 cs=(ca*x+t)%10;
 t=(ca*x+t)/10;
 s=s+p*cs;
 p=p*10;
 }
 if(t>0)s=s+p*t;
 cout<<s;
 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";
}

Cifra de control

Cifra de control a unui număr este cifra care se calculează însumând cifrele numărului, apoi însumând cifrele sumei, şi tot aşa până se obţine un număr cu o cifră. De exemplu, cifra de control a numărului 9895 se calculează: 9+8+9+5=31 ⇒ 3+1=4 ⇒ 4 – cifra de control.

Observăm că ea se poate calcula adunând numărului cu ultima cifră exclusă acea cifră.

9895

-îl excludem pe 5 şi îl adunăm la numărul rămas: 989+5=994

-îl excludem pe 4 şi îl adunăm la numărul rămas: 99+4=103

-îl excludem pe 3 şi îl adunăm la numărul rămas: 10+3=13

-îl excludem pe 3 şi îl adunăm la numărul rămas: 1+3=4

Algoritmul în C++

#include

using namespace std;

int main()
{
unsigned x;
cin>>x;
while(x>9)
{
x=x/10+x%10;
}
cout<<x;
return 0;
}