Algorytmy
Algorytmy C/C++ Python
Algorytm jest to ciąg czynności lub sposób postępowania prowadzący do wykonania określonego zadania lub rozwiązania problemu w skończonym czasie. Podstawowymi cechami algorytmów są: poprawność — algorytm powinien zwracać poprawne wyniki. jednoznaczność — algorytm powinien przy takim samym zbiorze danych wejściowych zwracać takie same wyniki. skończoność dla każdego zbioru poprawnych danych wejściowych algorytm powinien zwracać wyniki w skończonej liczbie kroków.
Spis treści
- Rozwiązywanie równań kwadratowych
- Parzystość liczb
- Największy wspólny dzielnik rekurencyjnie
- Silnia rekurencyjnie
- Uogólniony schemat Hornera
- Algorytm Newtona
- Interpolacja Lagrange’a
- Metoda najmniejszych kwadratów
Rozwiązywanie równań kwadratowych
C
#include<stdio.h> #include<math.h> int main() { float a, b, c, delta; printf("Podaj odpowiednio a, b, c: "); scanf("%f %f %f", &a, &b, &c); delta = b*b - 4*a*c; if(delta > 0) printf("Rownanie ma dwa pierwiastki: x1= %f i x2= %f", ( (-b-sqrt(delta)) / (2.0*a) ), ( (-b+sqrt(delta)) / (2.0*a) )); else if(delta < 0) printf("Rownianie nie ma pierwiastkow"); else printf("Rownianie ma jednen pierwiastek x1= %f", -b/(2.0*a)); return 0; }
C++
#include<iostream> #include<cmath> using namespace std; int main() { float a, b, c, delta; cout<<"Podaj odpowiednio a, b, c: "<<endl; cin>>a>>b>>c; delta = b*b - 4*a*c; if(delta > 0) cout<<"Rownanie ma dwa pierwiastki: x1="<<( (-b-sqrt(delta)) / (2.0*a) ) <<" x2= "<<( (-b+sqrt(delta)) / (2.0*a) )<<endl; else if(delta < 0) cout<<"Rownianie nie ma pierwiastkow"<<endl; else cout<<"Rownianie ma jednen pierwiastek x1= "<<-b/(2.0*a)<<endl; return 0; }
Python
import math a = float(input("a = ")) b = float(input("b = ")) c = float(input("c = ")) delta = b*b - 4*a*c if(delta > 0): print("Rownanie ma dwa pierwiastki x1=", (-b-math.sqrt(delta)) / (2*a), " x2= ",(-b+math.sqrt(delta)) / (2*a)) elif(delta < 0): print("Rownanie nie ma pierwiastkow") else: print("Rownanie ma jeden pierwiastek x1= ", -b / (2*a))
Parzystość liczb
C
#include<stdio.h> int main() { int a; printf("Podaj liczbe do sprawdzenia: "); scanf("%d", &a); if((a % 2)==1) printf("Nieparzysta"); else printf("Parzysta"); return 0; }
C++
#include<iostream> using namespace std; int main() { int a; cout<<"Podaj liczbe do sprawdzenia: "; cin>>a; if((a % 2)==1) cout<<"Nieparzysta"; else cout<<"Parzysta"; return 0; }
Python
a = int(input("Podaj liczbe do sprawdzenia: ")) if((a % 2)==1): print("Nieparzysta") else: print("Parzysta")
Algorytm korzysta z funkcji modulo
Największy wspólny dzielnik rekurencyjnie
C/C++
long long NWD(long long x, long long y) { if(y==0) return x; else return NWD(y, x%y); }
Python
def NWD(x,y): if(y==0): return x else: NWD(y, x%y)
W tym przykładzie kod nie różni się zbytnio w poszczególnych językach programowania jednak warto mieć na uwadze że funkcję modulo stosuje się na liczbach całkowitych. W przypadku języka C do wyświetlenia liczby należy użyć „%lli”.
Silnia rekurencyjnie
C/C++
long long silnia(int n) { if(n==0) return 1; else return n * silnia(n-1); }
Python
def silnia(n): if(n==0): return 1; else: return n * silnia(n-1);
Algorytm również można wykonać za pomocą iteracji potocznie mówiąc pętli.
Uogólniony schemat Hornera
C++
#include<iostream> using namespace std; int main() { int n=1, i=0; float wynik, punkt, wspolczynniki[n+1]; cin>>punkt>>n; for(i=0; i<=n; i++) { cin>>wspolczynniki[i]; } while(i<=n) { wynik= wynik*punkt + wspolczynniki[i]; i++; } for(i=0; i<n; i++) { for(int k=1; k<n-1; k++) { wspolczynniki[k] = wspolczynniki[k-1]*punkt + wspolczynniki[k]; wynik = wspolczynniki[k]; } silnia = long long silnia(int n); cout<<"Wynik: "<<wynik/silnia<<endl; return 0; }
Metoda Newtona
C++
#include<iostream> using namespace std; int main() { int n=0,pom; float x[n+1],y[n+1], p, IR[n+1]; cout << "Podaj liczbe wezlow: " << endl; cin >> n; cout << "Podaj kolejno x: "<<endl; for(int i=0; i<n; i++) { cin >> x[i]; } for(int i=0; i<n-1; i++) { if(x[i]>x[i+1]) { cout << "Zle podane x"<<endl; return 0; } } cout << "Podaj kolejno y: "<<endl; for(int i=0; i<n; i++) { cin >> y[i]; } cout << "Podaj punkt pomiaru: "; cin >> p; if(p<x[0] || p>x[n-1]) { cout << "Nie spelnione warunki"; return 0; } //------------------------------------------------------- for(int i=0; i<=n; i++) { IR[i]=y[i]; } for(int k=1; k<=n; k++) { for(int i=n; i>=k; i--) { IR[i]=(IR[i]-IR[i-1])/(x[i]-x[i-k]); } } //--------------------------------------------------------- int s=0; for(int i=0; i<=n-1; i++) { cout<< "IR[ "<<i<<" ]= "<<IR[i]<<endl; pom=1; for(int k=0;k<=i-1;k++) { pom = pom * (p-x[k]); } s=s+IR[i]*pom; } cout<<"S "<<s<<endl; return 0; }
Jest to algorytm iteracyjny służący do wyznaczania przybliżonej wartości pierwiastka
Interpolacja Lagrange’a
C++
#include<iostream> using namespace std; int main() { int n=1,p; float x[n],y[n],wynik; float pom,s=0; cout << "Podaj liczbe wezlow: " << endl; cin >> n; cout << "Podaj kolejno x: "<<endl; for(int i=0; i<n; i++) { cin >> x[i]; } for(int i=0; i<n-1; i++) { if(x[i]>x[i+1]) { cout << "Zle podane x"<<endl; return 0; } } cout << "Podaj kolejno y: "<<endl; for(int i=0; i<n; i++) { cin >> y[i]; } cout << "Podaj punkt pomiaru: "; cin >> p; if(p<x[0] || p>x[n-1]) { cout << "Nie spelnione warunki"; return 0; } for(int i=0; i<n; i++) { pom=1; for(int k=0; k<n; k++) { if(k!=i) { pom = pom*(p-x[k])/(x[i]-x[k]); } } s=s+pom*y[i]; } cout<<"wynik "<<s<<endl; return 0; }
Jak widać część kodu w tym algorytmie zaciągnięta jest z poprzedniego (metody Newtona)
Metoda najmniejszych kwadratów
C++
#include<iostream> using namespace std; int main() { int n; float x[100], y[100]; cout << "\nWprowadz liczbe par:\n"; cin >> n; //liczba par x i y cout << "\n\nPodaj wartosc pary:\n" << endl; for (int i = 0; i < n; i++) //wprowadzanie wartosci poszczegolnych x i y { cout << "Wartosc: " << i + 1 << " :\n"; cout << "x: "; cin >> x[i]; cout << "y: "; cin >> y[i]; } float sumy = 0, sumx = 0, sumxy = 0, sumxx = 0; for (int i = 0; i < n; i++) { sumy += y[i]; //obliczanie sumy y'greków sumx += x[i]; //obliczanie sumy x'ów sumxx += x[i] * x[i]; //obliczanie sumy x'ów do kwadratu sumxy += y[i] * x[i]; //obliczanie sumy y*x // sumxx += x[i] * x[i]; } cout << "\n\nWyniki sumx, sumy, sumxy, sumxx: " << sumx << "," //wyniki sum wszystkich << sumy << "," << sumxx << "," << sumxy << "." << endl; float a = (sumy * sumxx - sumx * sumxy) / (sumx * sumx - n * sumxx); //tutaj obliczone jest a0=Wa0/W taki jest wzór float b = (sumy * sumx - n * sumxy) / (sumx * sumx - n * sumxx); //tutaj obliczone jest a1=Wa1/W taki jest wzór cout << "\n\nWartosc a i b: " << a << " i " << b << "." << endl; cout << "\n\nWynik: y = " << a << " + " << b << "x.\n\n" << endl; return 0; }
Standardowa metoda przybliżania rozwiązań układów nad określonych, tzn. zestawu równań, w którym jest ich więcej niż zmiennych