Познати алгоритми за решавање на некои проблеми


  1. Да се најде НЗД (најголем заеднички делител) за внесени два природни броеви а и b со Евклидов алгоритам.

Евклидовиот алгоритам е заснован на принципот дека НЗД на бројот не се менува ако помалиот број се одземе од поголемиот, а потоа се одреди НЗД на новодобиениот број и помалиот од претходните два. На пример, 21 е НЗД за 252 и 105 (252=21×12; 105=21×5); бидејќи 252−105=147, НЗД за 147 и 105 е исто така 21. Со повторување на постапката ќе се добиваат се помали броеви, се додека еден од броевите не се сведе на 0.
Евклидовиот алгоритам е од итеративна природа, што значи дека крајниот резултат ќе се добие во низа чекори, а меѓурезултатот од претходниот чекор се користи во првиот следен чекор.

Решение:

#include <iostream>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
while ( a!= b )
{
if (a>b)
a -= b;
else
b -= a;
}
cout<<a;
return 0;
}





  1. Да се најде НЗС (најмалиот заеднички содржател) за внесени два природни броеви а и b.

Ако а и b не се и двата еднакви на 0, НЗС може да се пресмета по формулата

НЗС=a*b/НЗД

Ако ја искористиме претходната задача, ќе го добиеме следното решение:

#include <iostream>
using namespace std;
int main()
{
int a,b,nzs;
cin>>a>>b;
if ((a==0)&&(b==0))
nzs=0;
else
{
nzs=a*b;
while ( a!= b )
{
if (a>b)
a -= b;
else
b -= a;
}
nzs/=a;
}
cout<<nzs;
return 0;
}






3. Да се пресмета n-тиот член на Фибоначиевата низа.

Ознака на членот во низата: F1 F2 F3 F4 F5 F6 F7.....
Фибоначиева низа: 1 1 2 3 5 8 13.....



Секој нареден член во низата се добива по формулата: Fn=Fn-1 + Fn-2



Решение:



#include <iostream>
using namespace std;
int main()
{
int n,f1,f2,fn,i;
cout<<"Koj clen na Fibonacievata niza sakas da go presmetas ";
cin>>n;
f1=1; f2=1;
if ((n==1)||(n==2))
fn=1;
else
for(i=3;i<=n;i++)
{
fn=f1+f2;
f1=f2;
f2=fn;
}
cout<<endl<<n<<" - tiot clen na Fibonacievata niza e "<<fn;
return 0;
}



  1. Изработка на програми со сите претходно изучени техникиЗа даден број n да се провери дали е совршен број.



Бројот н е совршен ако е еднаков на збирот на сите негови делители, со исклучок на самиот број. На пример, 6=1+2+3, значи бројот 6 е совршен број.



Решение:



#include <iostream>
using namespace std;
int main()
{
int n,i,zbir ;
cout<<"Vnesi go brojot za koj sakas da proveris dali e sovrsen ";
cin>>n;
zbir = 0;
for (i = 1; i <= n/2; i++)
if (n % i == 0)
zbir += i;
if (n == zbir)
cout<<endl<<"Brojot "<<n<<" e sovrsen.";
else
cout<<endl<<"Brojot "<<n<<" ne e sovrsen.";
return 0;
}



Квиз