using System; using System.Collections; using System.Collections.Generic; using System.Text;
namespace Dortikum { class Fraction { int numerator = 1; int portent = 1;
public Fraction()
{ // ~ }
public Fraction(int numerator, int portent)
{ this.Numerator = numerator; this.Portent = portent; }
// числителя на дробта public int Numerator { get { return this.numerator; } set { this.numerator = value; }
}
// знаменателя на дробта public int Portent { get { return this.portent; } set { if (value == 0)
{ throw new DivideByZeroException(); } else { this.portent = value; }
}
}
// проверява дали дробта е равна на 0 (демек, дали числителят е 0) public bool IsZero { get { return (this.Numerator == 0) ? true : false; }
}
// // Опростява дробта
// public void Simplify()
{ // простите делители на числителя ArrayList numeratorDivisors = GetDivisors(this.Numerator);
// простите делители на знаменателя ArrayList portentDivisots = GetDivisors(this.Portent);
// пробваме с всеки от простите делители на знаменателя, дали е прост делител на
// числителя и ако се укаже така, тогава делиме и числителя и знаменателя на
// това число foreach (int i in portentDivisots)
{ if (numeratorDivisors.Contains(i))
{ this.Portent = this.Portent / i; this.Numerator = this.Numerator / i; }
numeratorDivisors.Remove(i); }
}
// // Сбор на текущата дроб с друга
// public void Add(Fraction fract)
{ Fraction fr = new Fraction();
// намираме НОК на знаменателите на двете дроби, тъй като той ще бъде
// знаменателят на новата дроб fr.Portent = NOK(this.Portent, fract.Portent);
// разделяме поотделно новия знаменател на числителите на двете дроби
// и след това получената стойност умножаваме по тях
// накрая събираме двете получени стойности fr.Numerator = (fr.Portent / this.Portent) * this.Numerator + (fr.Portent / fract.Portent) * fract.Numerator;
// // Сбор на цяло число с тази дроб
// public void Add(int number)
{ // може да разглеждаме цялото число като дроб със знаменател 1 this.Numerator += this.Portent * number;
// опростяваме дробта this.Simplify(); }
// // Разлика на текущата дроб с друга
// public void Subtract(Fraction fract)
{ Fraction fr = new Fraction();
// намираме НОК на знаменателите на двете дроби, тъй като той ще бъде
// знаменателят на новата дроб fr.Portent = NOK(this.Portent, fract.Portent);
// разделяме поотделно новия знаменател на числителите на двете дроби
// и след това получената стойност умножаваме по тях
// накрая изваждаме двете получени стойности fr.Numerator = (fr.Portent / this.Portent) * this.Numerator - (fr.Portent / fract.Portent) * fract.Numerator; fr.Simplify();
// // Разлика на текущата дроб с цяло число
// public void Subtract(int number)
{ // може да разглеждаме цялото число като дроб със знаменател 1 this.Numerator -= this.Portent * number;
// опростяваме дробта this.Simplify(); }
// // Умножение на дадена дроб с текущата
// public void MultiplyWith(Fraction fract)
{ // поотделно умножаваме числителите и знаменателите на двете дроби this.Numerator *= fract.Numerator; this.Portent *= fract.Portent;
// опростяваме новата дроб this.Simplify(); }
// // Умножение на дадена дроб с цяло число
// public void MultiplyWith(int number)
{ // поотделно умножаваме числителите и знаменателите на двете дроби this.Numerator *= number;
// опростяваме новата дроб this.Simplify(); }
// // Деление на дадена дроб с текущата
// public void DivideBy(Fraction fract)
{ // ако посочената дроб е 0, възниква грешка при деление на 0 if (fract.IsZero) throw new DivideByZeroException();
// делението е всъщност умножение на едната дроб с реципрочната на другата this.Numerator *= fract.Portent; this.Portent *= fract.Numerator;
// опростяваме новата дроб this.Simplify(); }
// // Деление на дадена дроб с цяло число
// public void DivideBy(int number)
{ // ако числото е 0, възниква грешка при деление на 0 if (number == 0) throw new DivideByZeroException();
// делението е всъщност умножение на едната дроб с реципрочната на другата this.Portent *= number;
// опростяваме новата дроб this.Simplify(); }
// // Представяне на дробта в текстов вид
// public override string ToString()
{ if (this.Portent == 1)
{ // ако знаменателя е равен на 1, то рационалното число съвпада
// с цялото число със стойност, равна на числителя на дробта
return this.Numerator.ToString(); } else if (this.Portent == -1)
{ // ако знаменателя е равен на -1, то рационалното число съвпада
// с цялото число със стойност, равна на числителя на дробта умножен по -1
return Convert.ToString((-1) * this.Numerator); } else if (this.Portent < 0)
{ // ако знаменателят е отрицателен, то прехвърляме минуса в числителя
// // Намира всички прости делители на дадено число (без числото 1 като делител)
// Ако някой делител се повтаря, също се взима
//
// Например, предстваме числото 12 като 2.2.3
// private ArrayList GetDivisors(int number)
{ ArrayList divisors = new ArrayList(); // простите делители на числото int i = 2;
// работим с положителни числа number = Math.Abs(number);
// пробваме с всяко число, което е по-малко или равно на даденото число
// ако числото, с което пробваме дели без остатък даденото число,
// записваме това число като прост делител и отново пробваме с него, за да
// провериме дали не е отново делител while (i <= number)
{ if (number % i == 0)
{ divisors.Add(i);
number = number / i; } else { i++; }
}
return divisors; }
// // Намира най-малко общо кратно на две числа
// private int NOK(int firstNum, int secondNum)
{ ArrayList firstNumDivisors = GetDivisors(firstNum); // делителите на първото число ArrayList secondNumDivisors = GetDivisors(secondNum); // делителите на второто число ArrayList commonDivisors = new ArrayList(); // общите делители int result = 1;
// общите делители на двете числа са всичките делители на първото число плюс
// тези делители на второто число, които се различават от тези на първото по
// стойност или по брой
// // Например: търсим НОК на 12 и 16. Числото 12 се представя като 2.2.3, а числото 16
// като 2.2.2.2. Общите прости делители на двете числа са: 2,2,3 (простите
// делители на 12) и 2,2 (простите делите на 16, които се различават по брой
// от тези на 12). И следователно НОК на 12 и 16 е равно на 2.2.3.2.2 = 48
foreach (int i in firstNumDivisors)
{ commonDivisors.Add(i); }
foreach (int i in secondNumDivisors)
{ if (!firstNumDivisors.Contains(i))
{ commonDivisors.Add(i); } else { firstNumDivisors.Remove(i); }
}
foreach (int i in commonDivisors)
{ result *= i; }