- съставно условие
- алгоритъм на Евклид
- естествено число - прости делители
- решето на Ератостен
- цифри и числа
- побитови операции
- точност при извеждане
- проверка на входни данни
- наредба - сортиране
- сортиране - пряк избор
- сортиране - вмъкване
- сортиране размяна
- сливане на редици
- вмъкване на елемент
- двумерен масив
- диагонал в матрица
- матрица
- матрица - транспониране
- матрица - събиране
- матрица - умножение
- множество - елементи
- множество - допълнение
- множества - обединение
- множества - разлика
- множества - сечение
- линейно уравнение
- квадратно уравнение
- полином
- рекурсия - итерация
- числов триъгълник
- минимална стойност
- средна стойност
- факториел
- числа на Фибоначи
- Питагорова тройка числа
- палиндром - решена задача
- алчен алгоритъм
- египетски дроби
- комбинации
решаване на квадратно уравнение, Диофантово уравнение, метод на Хорнер
решаване на квадратно уравнение
решаване на непълно квадратно уравнение
квадратно уравнение - формули на Виет (Vieta)
квадратно уравнение - обратна теорема на Виет
решаване на уравнение по метод на Хорнер
решаване на Диофантово уравнение
sqrt - изчисляване на корен квадратен
Всяко уравнение се състои от два аритметични израза свързани със знака за равенство. Прието е променливите да се изписват с последните букви от латинската азбука - като x, y, z. Коефициентите на уравнението са числа. При представяне на уравнение коефициентите се бележат с началните букви на латинската азбука - като a, b, c. Когато най-високата степен на неизвестното е 2 говорим за квадратно уравнение. Непълно квадратно уравнение - когато b=0 или c=0. Нормален вид на квадратно уравнение - когато коефициентът a=1.
решаване на квадратно уравнение
Нека имаме уравнение, при което коефициентът пред най-високата степен на неизвестното е различен от 0, а най-високата степен на уравнението 2. Такова уравнение ще наричаме квадратно уравнение. Едно квадратно уравнение се задава чрез стойностите на коефициентите пред неизвестното A, B, както и на свободния член C.
Чрез знака ^ изразяваме степенуване, а sqrt - е функция за корен квадратен.Ax^2 + Bx + C = 0
Нека разгледаме последователно възможните решения:
1) при A=0, квадратното уравнение се редуцира до линейно и има едно единствено решение (при B<>0) x = -C/B
2) при C = 0 квадратното уравнение придобива вида: A*x^2 + Bx = 0 и има корени x = -B/A, както и x = 0
3) изчисляваме дискриминантата D=B*B - 4*A*C.
Ако D = 0 квадратното уравнение има само един корен X1=-B/2A. В блок схемата този случай се представя като двоен корен на уравнението.
Ако D >0 това квадратно уравнение има следните реални корени (с sqrt означаваме функцията корен квадратен):
X1= (-B - sqrt (D)) / (2*A)
X2= (-B + sqrt (D)) / (2*A)
Ако D < 0 това квадратно уравнение има следните комплексни корени:
X1= (-B - i*(sqrt (D)) / (2*A)
X2= (-B + i*(sqrt (D)) / (2*A)
Където i е имагинерната единица имаща стойност sqrt (-1)
В този случай корените на това квадратно уравнение са комплексно спрегнати - имат една и съща реална част и различни по знак, но с еднаква абсолютна стойност имагинерна част.
Следващата примерна програма реализира алгоритъм за решаване на квадратно уравнение.
#include<iostream>
using namespace std;
#include <stdlib.h>
#include <cmath>
int main()
{ int a,b,c;
double re1,re2,D,D1;
cout<<"Da se systawi programa, chrez koqto se wywevdat 3 estestwen\n";
cout<<"chisla A, B, C predstawlqwashi koeficientite na kwadratno urawnenie\n";
cout<<"se izchislqt wyzmovnite koreni na towa urawnenie.\n";
cout<<"Primer 1 -5 6 Izhod 2,3.\n";
cout<<endl;
cout<<"Molq, wywedete stojnostta na koeficientite!\n";
cout<<"Wywedete koeficienta A: "; cin>>a;
cout<<"Wywedete koeficienta B: "; cin>>b;
cout<<"Wywedete koeficienta C: "; cin>>c;
if (a==0) //koeficienta pred kwadrata na neizwestnoto
{ if (b==0) cout<<"towa urawnenie nqma reshenie\n";
else {re1=(double)-c/b;
cout<<" towa urawnenie ima edinstwen koren "<<re1<<endl;}
}//if (a==0)
else {// (a==0)
D1=(double)b*b - 4 * a*c;//towa sa celi chisla
cout<<"Koreni na towa urawnenie sa: ";
if (D1>=0)
{D=sqrt(D1);//ako D1<0 nqma realni koreni
re1=-D-b; re1/=(2*a);//formuli na Wiet
re2=D-b; re2/=(2*a);
cout<<re1;
if (D!=0) cout<<"; "<<re2<<endl; else cout<<endl;
//ako korena e samo 1 t.e. diskriminanta na 0
}
else {//(D1=>0)
cout<<"\n towa urawnenie nqma realni koreni!\n";
}// else (D1=>0)
}
system ("pause");
return 0;
}//kraj na programa kwadratno urawnenie
решаване на непълно квадратно уравнение
Ако в квадратното уравнение от вида Ax^2 + Bx + C един от кеофициентите B или C е равен на нула казваме, че това е непълно квадратно уравнение.
Имаме две възможности:
1) B = 0 - уравнението има реални корени само, ако знаците пред коефициенти A и C са различни. В този случай x1 = - sqrt( C/A); x2 = sqrt( C/A);
ако и c = 0 уравнението има единствен корен 0.
2) C = 0 - уравнението има корени x = 0 и x = - sqrt(B/A)
#include <iostream>
#include <cmath>
using namespace std;
double A,C;
#define koren sqrt(-C/A)
int main ()
{ cout<<"Da se systawi programa, chrez koqto se wywevdat \n";
cout<<"koeficienti A i C w nepylno kwadratno urawnenie ot wida Ax*x + C =0.\n";
cout<<"Programata da izweve izchislenite koreni na towa kwadratno urawnenie.\n";
cout<<"Primer A=2 C=-8 Izhod: -2, 2\n";
cout<<"Wywedete koeficient A: ";cin>>A;
cout<<"Wywedete koeficient C: ";cin>>C;
if ((A<0 && C>0) || (A>0 && C<0))
{ cout<<"Towa urawnenie ima koren x1 = "<<-1 * koren <<"; x2 = "<< koren <<endl;}
else cout<<"Towa urawnenie ima kompleksni koreni\n";
system ("pause");
return 0;
}// nepylno kwadratno urawnenie
квадратно уравнение - формули на Виет (Vieta)
Френският математик Франсоа Виет (Vieta) пръв въвежда буквените означения за коефициентите на уравнение за получаване на общи доказателства. В неговите трудовете по математика се описват и случай за уравнения с по-висока степен от 2. Чрез формулите на Виет могат да се изразяват зависимостите между коефициентите пред неизвестното в дадено уравнение и неговите корени. Ще разгледаме случай за квадратно уравнение, представено чрез коефициентите A, B, C.
Ax^2 + Bx +C = 0, съответно с корени x1, x2.x1 + x2 = - B/A; p=-B/A
x1 * x2 = C/A; q= C/A
Приема се, че коефициента А е положителна стойност.
Ако корените са реални е възможно да се определят знаците на корените без да се решава самото уравнение. От предходните два реда могат да се извадят следните изводи: ако произведението на двата корена има стойност <0, то корените са с различен знак, както и обратното корените са с еднакъв знак, ако тяхното произведение е >0; ако сумата на двата корена е 0, то корените са с еднаква абсолютна стойност и различни по знак.
Следващата примерна програма илюстрира обработване на данни за коефициенти на квадратно уравнение чрез формули на Виет:
#include <iostream>
using namespace std;
int main()
{double a,b,c, sum, proiz;
cout<<"Da se systawi programa, chrez koqto se wywevdat 3 stojnosti ot\n";
cout<<"interwala [-99..99] i se izwevda sumat i proizwedenie ot \n";
cout<<"korenite na kwadratno uweanenie.\n";
cout<<"Primer: 1, -9, 20 Izhod 9,20\n";
cout<<"Wywedete koeficient A: ";cin>>a;
cout<<"Wywedete koeficient B: ";cin>>b;
cout<<"Wywedete koeficient C: ";cin>>c;
if (a) {
sum=-b/a;// x1 + x2
proiz=c/a;// x1 * x2
cout<<" suma ot koreni w urawnenie "<<sum<<endl;
cout<<" proizwedenie koreni na urawnenie "<<proiz<<endl;
if (c){
if (c>0) cout<<"Korenite sa s ednakwi znaci.\n";
if (c<0) cout<<"Korenite sa s razlichni znaci.\n";
} else cout<<"Pone edin ot korenite e 0.\n";
} else cout<<"Wywedenite danni sa za linejno urawnenie.\n";
system("pause");
return 0;
}//programa kwadratno uweanenie
квадратно уравнение - обратна теорема на Виет
Съществува теорема, обратна на описаната теорема на Виет, която гласи следното: която ако две числа x1 и x2 изпълняват условията x1 + x2 = − p и x1.x2 = q, то тези числа x1, x2 са корени на квадратното уравнение x^2 + px + q = 0.
#include <iostream>
using namespace std;
int main()
{double sum, proiz,x1,x2;
cout<<"Da se systawi programa, chrez koqto se wywevdat 2 stojnosti ot\n";
cout<<"interwala [-99..99] i se izwevda koeficientite na kwadratno uweanenie.\n";
cout<<"Primer: 4,5 Izhod 1, -9, 20\n";
cout<<"Wywedete stojnost za x1: ";cin>>x1;
cout<<"Wywedete stojnost za x2: ";cin>>x2;
sum=-1*(x1+x2);// x1 + x2
proiz=x1*x2;// x1 * x2
cout<<" kwadratnoto urawnenie ima wida:\n";
cout<<"1x^2 ";
if (sum<0) cout<<sum<<"x "; else cout<<" + "<<sum<<"x ";
if (proiz<0) cout<<proiz; else cout<<"+ "<<proiz;
cout<<" = 0\n";
system("pause");
return 0;
}// programa kwadratno urawnenie
решаване на уравнение по метод на Хорнер
Предложеният от английският математик Хорнер (William George Horner) алгоритъм за намиране корени на квадратно уравнение и от по-висока степен се състои в следното:
Рационалните корени на уравнение или нули на полином са числата от вида p/q, където с p се означават всички делители на свободния член, с q всички делители на коефициента пред най-високата степен в разглежданото уравнение / полином. Уравнението може да има за корени цели числа, ако свободния член се дели без остатък на коефициента пред най-високата степен в уравнението. Корени на това уравнение могат да бъдат делителите на свободния член взети със знак минус и плюс. В процеса на търсене корените на въведеното уравнение се вземат се само коефициентите пред съответните степени. Ако дадена степен липсва в данните за това уравнение като коефициент на съответното място се записва 0.
Така при описанието на алгоритъма приемаме, че всички коефициенти в разглежданото уравнение са цели числа или нула, степените на неизвестното са подредени в низходяща наредба. Задачата за решаване на уравнение по метода на Хорнер значително се облекчава ако коефициентът пред най-високата степен е винаги 1.
Избраното за корен число (записано в най-лявата част на таблицата) се умножава с коефициента пред най-високата степен и се събира със следващия го коефициент. Ако последната сума се получи 0, то това число е корен на уравнението. Проверката продължава с получените нови коефициенти – при търсене на нов корен за уравнението. Едно уравнение може да има няколко корена с една и съща стойност. Проверява се дали вече намерен корен на уравнението не се повтаря.
Предимство на метода на Хорнер, е че проверката дали дадено число е корен се състои в умножение и събиране, т.е. не налага вдигане на степен. Друго предимство, е че след намиране на един или повече корени максималната степен на това уравнение вече се намалява с 1.
Следващата примерна програма дава решена задача за решаване на уравнение по метода на Хорнер:
#include <iostream>
using namespace std;
int mas[100];
int Wywedi(int mas[])
{char ose;
int broi=0;
do {
cout<<"Wywedete koeficient za stepen: "<<broi<<": ";
cin>>mas[broi];
cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
broi++;
} while (ose=='y');
return broi-1;
}//Wywedi
int Horner ( int stepen, int kolko)
{int i,rez,koren,kor;
for (i=stepen;i>=kolko;i--) cout<<mas[i]<<"; ";
cout<<endl;
cout<<"Wywedete stojnost za koren: ";cin>>koren;
rez=mas[stepen];
for (i=stepen;i>=kolko;i--)
{if (i<stepen) rez=rez*koren + mas[i];
cout<<rez<<" ";
} //for
cout<<endl;
if (rez) kor=kolko; //urawnenie - zapazwa maksimalnata stepen
else //ako e otkrit koren redukciq broq na koeficientite
{ cout<<"Chisloto "<<-1*koren<<" e koren na urawnenieto.\n";
for (i=stepen-1;i>=kolko;i--) { mas[i]+=mas[i+1]*koren;}
kor=kolko+1;//nulewata stepen se mesti s 1 poziciq nalqwo
// urawnenie - namalqwa stepenta si s -1
}
return kor;
}// Horner - prowerqwa dali chisloto e koren na urawnenie
int main()
{int stepen, kor,br_step;
char ose;
cout<<"Imate urawnenie ot stepen N, predstaweno s koeficientite pred \n";
cout<<"wsqka ot stepenite na neizwestnoto. Koeficientite sa celi chisla\n";
cout<<"ot interwala [-100..100]. Da se systawi programa, chrez koqto\n";
cout<<"se tyrsqt korenite na urawnenie po metod na Horner.\n";
cout<<"Stepennite pokazateli se wywevdat ot 0-lewa do N-tata stepen.\n";
cout<<"Primer:4 4 1 koren -2 Izhod: Da\n";
br_step=kor=0;
stepen=Wywedi( mas);// stepen na polinom
do {
br_step=Horner( stepen, kor);//dali se reducira, t.e. dali e otkrit koren
kor=br_step;
cout<<"She prowerqwate li drug koren <y/n>: ";cin>>ose;
} while (ose=='y');
system("pause");
return 0;
}//programa urawnenie po metod na Horner
решаване на Диофантово уравнение
Уравнение от вида a*x + b*y = c, където a,b,c са произволни цели числа ще наричаме Диофантово уравнение от първа степен. Ако указаните коефициенти са рационални числа може да бъде намерено тяхното най-малко общо кратно и отново да получим уравнение с цели числа. В следващата примерна програма ще разглеждаме коефициентите в конкретно Диофантово уравнение само като цели числа. От теоретичните изследвания е доказано съществуването на необходимо и достатъчно условие едно Диофантово уравнение от вида ax + by = c да има поне едно решение с цели числа е най-големият общ делител на a и b да дели с. Този делител може да бъде и 1, т.е. коефициентите a,b са взаимно прости числа. Ако коефициентите a, b, c имат общ делител - НОД, то чрез делене можем да редуцираме коефициентите в уравнението. Да разгледаме следната примерна задача: Имаме въведени коефициенти a,b,c на Диофантово уравнение. Търсим дали това уравнение има за корени цели числа от даден числов интервал. Ще използваме метода на грубата сила – като проверим с вложен цикъл дали за конкретни целочислени стойности двете части на това Диофантово уравнение са равни.
Следващата примерна програма дава решена задача за решаване на Диофантово уравнение:
#include<iostream>
using namespace std;
void Diofantowo ()
{int ch_x,ch_y,ch_z,x,y,z,granica,resh;
cout<<"A, B, C, Granica sa estestweni chisla ot interwala [0..30000]: "<<endl;
cout<<" koeficienta A: ";cin>>ch_x;
cout<<" koeficienta B: ";cin>>ch_y;
cout<<" koeficienta C: ";cin>>ch_z;
cout<<"Wywedete dopustim interwal za tyrsene: ";cin>>granica;
resh=0;//za wsqko neizwestno se tyrsi do razmera na swobodniq chlen - sum
for(x=0;x<=granica;x++)
{for(y=0;y<=granica;y++)
{if (ch_z==ch_x*x+ch_y*y)
{cout <<"Wyzmovno reshenie: x="<< x << " y=" << y << endl;
resh=1;}// pone edno reshenie
if (ch_z==-1*ch_x*x+ch_y*y)
{cout <<"Wyzmovno reshenie: x="<< -1*x << " y=" << y << endl;
resh=1;}//pone edno reshenie
if (ch_z==-1*ch_x*x-ch_y*y)
{cout <<"Wyzmovno reshenie: x="<< -1*x << " y=" << -1*y << endl;
resh=1;}//pone edno reshenie
if ( ch_z==ch_x*x-ch_y*y)
{cout <<"Wyzmovno reshenie: "<< x << " y=" << -1*y << endl;
resh=1;}//pone edno reshenie
}// for y
}// for x
if (resh<1) {cout<<"Nqma resheniq w oblastta na celite chisla!"<<endl;}
} // Diophantowo urawnenie
int main()
{// izcherpwasho tyrsene - warianti za koreni na Diophantowo urawnenie
char ose;
cout<<"Systawete programa, koqto reshawa Diophantowoto urawnenie Ax+By=C\n";
cout<<"kydeto A, B, C sa estestweni chisla, kakto i interwal z tyrsene N. \n";
cout<<"Primer: -13, 25, 2, 5 Izhod: x=-4 y=-2 c=2\n";
do {Diofantowo ();
cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
} while (ose=='y');
system("pause");
return 0;
}// programa Diophantowo urawnenie
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.