Форум программистов, компьютерный форум, киберфорум
rattrapper
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Полноценный класс дроби (работа с обычными дробями) C#

Запись от rattrapper размещена 17.11.2013 в 17:09
Показов 171 Комментарии 0

Исходный код класса дроби
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
class Factor
{
    public int Enumerator { get { return _enum; } set { _enum = value; } }
    public int Denumerator { get { return _denum; } set { _denum = value; } }
 
    int _enum;
    int _denum;
 
    public Factor(int e, int d)
    {
        SetED(e, d);
    }
    public Factor(string fact)
    {
        var s = fact.Split('/');
        SetED(int.Parse(s[0]), int.Parse(s[1]));
    }
    public Factor(double d)
    {
        int i = 0;
        while (d % 1 != 0)
        {
            d *= 10;
            i++;
        }
        SetED((int)d, (int)Math.Pow(10, i));
    }
    void SetED(int e, int d)
    {
 
        _enum = e;
        if (d == 0) throw new DivideByZeroException();
        _denum = d;
        Optimize();
    }
    void Optimize()
    {
        if (_denum == 1) return;
        else if (_enum % _denum == 0)
        {
            _enum /= _denum;
            _denum = 1;
        }
        else if (isSimple(_enum)) return;
        else
        {
            int min = Abs(_enum) > Abs(_denum) ? _denum : _enum;
            for (int i = 2; i < min; i++)
                if (isSimple(i))
                    if (_enum % i == 0 && _denum % i == 0)
                    {
                        _enum /= i;
                        _denum /= i;
                        Optimize();
                    }
        }
    }
    bool isSimple(int val)
    {
        val = Abs(val);
        for (int i = 2; i <= val / 2; i++)
            if (val % i == 0) return false;
        return true;
    }
    int Abs(int i)
    {
        if (i >= 0) return i;
        else return -i;
    }
    
    public override string ToString()
    {
        return _denum != 1 ? String.Format("{0}/{1}",
            Enumerator, _denum) : (Enumerator / _denum).ToString();
    }
    public static Factor operator +(Factor f1, Factor f2)
    {
        return new Factor(f1.Enumerator * f2._denum + f2.Enumerator * f1._denum,
            f1._denum * f2._denum);
    }
    public static Factor operator -(Factor f1, Factor f2)
    {
        return new Factor(f1.Enumerator * f2._denum - f2.Enumerator * f1._denum,
            f1._denum * f2._denum);
    }
    public static Factor operator *(Factor f1, Factor f2)
    {
        return new Factor(f1.Enumerator * f2.Enumerator, f1._denum * f2._denum);
    }
    public static Factor operator /(Factor f1, Factor f2)
    {
        return new Factor(f1.Enumerator * f2._denum, f1._denum * f2.Enumerator);
    }
    public static Factor operator +(Factor f1, int i)
    {
        return new Factor(f1.Enumerator + i * f1._denum, f1._denum);
    }
    public static Factor operator -(Factor f1, int i)
    {
        return new Factor(f1.Enumerator - i * f1._denum, f1._denum);
    }
    public static Factor operator *(Factor f1, int i)
    {
        return new Factor(f1.Enumerator * i, f1._denum);
    }
    public static Factor operator /(Factor f1, int i)
    {
        return new Factor(f1.Enumerator, f1._denum * i);
    }
    public static explicit operator double (Factor f)
    {
        return (double)f.Enumerator / (double)f.Denumerator;
    }
    public static explicit operator int(Factor f)
    {
        return (int)(double)f;
    }
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru