Sunteți pe pagina 1din 3

Laborator 1: Introducere in algoritmi

I.

Notiuni teoretice

1. Ce este un algoritm? Cuvantul algoritm are la origine numele matemeticianului person Al-Khwarizmi. Un algoritm inseamna o metoda sau procedura alcatuita din pasii necesari rezolvarii unei probleme sau, in general, unei categorii de probleme. Un algoritm este caracterizat de urmatoarele proprietati: - Corectitudine: furnizarea de catre algoritm a unei solutii corecte pentru problema data. - Generalitate: un algoritm trebuie sa fie capabil sa rezolve o categorie de probleme si nu o problema particulara. - Claritate: algoritmul trebuie sa descrie clar pasii ce trebuie urmati pentru a rezolva o problema - Finititudine: un algoritm se termina dupa un numar finit de pasi - Eficienta: inseamna viteza(timpul de obtinere a rezultatului) si spatiul(spatiul pe disc alocat si cantitatea de memorie alocata in timpul procesarii) - Existenta unei intrari: datele ce vor fi prelucrate - Existenta unei iesiri: rezultatul obtinut in urma prelucrarii intrarii. 2. Clasificarea algoritmilor a. dupa modul de implementare: - recursivi - iterativi - serial-paralel - deterministic-aleatoriu b. dupa paradigma utilizata: - algoritmi backtracking - algoritmi divide et impera - algoritmi de programare dinamica - algoritmi de tip greedy etc. 3. Algoritmi fundamentali 1. 2. 3. 4. 5. 6. 7. Inmultirea a la russe Sortarea prin selectie Sirul lui Fibonacci Algoritmul lui Euclid pentru calculul celui mai mare divizor comun Triunghiul lui pascal Inmultirea matricelor Turnurile din Hanoi

II.

Prezentarea lucrarii de laborator

1. Inmultirea a la russe Metoda nu presupune folosirea inmultirii ci divizarea cu 2 si adunarea. Algoritmul este:

Codul de mai jos exemplifica modul de implementarea a algoritmului intr-un limbaj de programare(in cazul de fata, Java).
import java.util.Scanner; public class Russe { public static int arusse(int a, int b) { int[] x,y; int i=1, prod=0; x=new int[1000]; y=new int[1000]; x[1]=a; y[1]=b; while(x[i]>1) { x[i+1]=x[i]/2; y[i+1]=y[i]+y[i]; i=i+1; } while(i>0) { if((x[i]%2)!=0) prod=prod+y[i]; i=i-1; } return prod; } public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("Se efectueaza inmultirea a doua numere: "); System.out.println("Primul numar: "); int a=s.nextInt(); System.out.println("Al doilea numar: ");

} }

int b=s.nextInt(); System.out.println("Produsul celor 2 numere este: "+arusse(a,b));

2. Algoritmul lui Euclid pentru calculul celui mai mare divizor comun a.) Pseudocod

b.) Implementarea algoritmului in limbajul de programare Java


import java.util.Scanner; public class AlgEuclid { public static int cmmdc(int m, int n) { int temp; while(n!=0) { temp=n; n=m%n; m=temp; } return m;

public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("Calculul celui mai mare divizor comun folosind algoritmul lui Euclid "); System.out.println("Primul numar: "); int m=s.nextInt(); System.out.println("Al doilea numar: "); int n=s.nextInt(); System.out.println("Cel mai mare divizor comun este: "+cmmdc(m,n)); } III. [de completat] Teme