Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/27: Рейтинг темы: голосов - 27, средняя оценка - 4.89
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
1

Извлекаем факториал с абсолютной точностью.

26.07.2011, 03:52. Показов 4975. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот представляю вам утилитку для нахождения факториала. Просто я часто встречал вопросы с факториалом и числами высокой точности на форумах вот и решил написать dll.Можно узнавать факториал числа от 0 до 3200, возвращается string-овой строкой, можно с разделителями, можно без. Также можно узнать количество разрядов (кол-во которых может достигать чуть меньше 10 к) в получившемся факториале, и ещё примерное время вычисления. Вообщем более подробное описание свойств в архиве в текстовом документе.
Кидаю программку и исходник программки с dll файлом.
Надеюсь кому-нибудь она пригодится=)
Вложения
Тип файла: rar factorialdll.rar (5.4 Кб, 49 просмотров)
Тип файла: rar Извлекаем факториал исходник.rar (166.7 Кб, 56 просмотров)
Тип файла: rar факториал.rar (14.0 Кб, 49 просмотров)
3
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2011, 03:52
Ответы с готовыми решениями:

Решить уравнение с абсолютной точностью
помогите,пожалуйста,составить программу: Используя метод итераций решить следующее уравнение:...

Вычислить факториал с точностью Е
есть программный код VB Sub Пример6() Dim x, eps As Single Dim i As Long eps = 0.001 '...

факториал с точностью до единицы
Привет всем! Помогите исправить код,считает правильно все факториалы от 0 до 20,у остальных...

Вычислить факториал с заданной точностью
Дано выражение \sum_{i=1}^{6}{i}^{0.4}\sum_{j=1}^{\infty}\frac{{10}^{0.1ij}}{j!-{j}^{2}+5.2}...

35
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
26.07.2011, 03:55  [ТС] 2
Программа нужна лишь для презентации dll.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 04:00 3
почему только до 3200? и почему 3 архива?
0
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
26.07.2011, 12:56  [ТС] 4
Maxwe11, один архив с dll, один проект с программой-презентацией, и третий проект с исходником программы. До 3200 так как для больших чисел нужно больше времени для вычисления, на 3200 факториал высчитывает около 10 минут. Я думаю этого достаточно. Но если кому-то нужно больше, обращайтесь.
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
26.07.2011, 13:10 5
probit, а какой метод был использован для нахождения факториала - цикл или рекурсия - если рекурсия, то с помощью цикла можно ускорить выполнения программы
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 15:01 6
probit, ахах, хорошо пошутил, вот только имена методов/переменных и т.д. в юникоде оценит и похвалит только школьник, а про эффективность вычислений я вообще молчу
0
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
26.07.2011, 15:18  [ТС] 7
Eugene22, из-за ограниченности доступных переменных, я создал массив из 10 тыс разрядов, в которых производится умножение "столбиком" с переносами разрядов и т. п. использованы циклы, с рекурсией было бы намного хуже.

Добавлено через 2 минуты
Maxwe11, я лишь новичёк, предложишь эффективнее - буду только рад набраться опыта. А имена свойств не думаю, что имеют важного значения.
0
196 / 188 / 15
Регистрация: 09.02.2011
Сообщений: 457
26.07.2011, 15:56 8
Код не смотрел, просто думал что факториал можно посчитать так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
    Function factor1(ByVal intInput As Integer) As String
 
        If intInput < 0 Then Return -1
        Dim factor As System.Numerics.BigInteger = 1
        'Dim start As DateTime = DateTime.Now
        For i As Integer = 1 To intInput
            factor *= i
        Next
        'Debug.Print((DateTime.Now - start).TotalMilliseconds)
        Return factor.ToString
    End Function
Просто интересно там что-то особенное или просто тренировка в создании класса?
0
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
26.07.2011, 16:22  [ТС] 9
Bazzy, какова величина переменной Big integer?

Добавлено через 3 минуты
VB.NET
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
Public Function Вычисление(ByVal число As Short) As String
        s = Str(число)
        full = False
        For i = 0 To l
            fac(i) = Nothing
        Next
        fac(l) = 1
        операция(Val(s))
        If full Then
            Return "Переполнено"
        Else
            s = ""
            Dim q As Short = 0
            Dim w As Boolean = False
            Do While fac(q) = Nothing
                q += 1
            Loop
            Do Until w
                s = s & Str(fac(q))
                r += 1
                q += 1
                If q = l + 1 Then w = True
            Loop
            Dim g() As String
            g = s.Split(" ")
            s = Join(g, "")
            If razd Then
                For i = Len(s) To 1 Step -1
                    If i Mod 3 = 0 And i <> Len(s) Then
                        s = s.Insert(Len(s) - i, ".")
                    End If
                Next
            End If
            Return s
        End If
    End Function
 
 
    Private Sub операция(ByVal число As Integer)
        For i = 1 To число
            For j = l To 0 Step -1
                Try
                    fac(j) = fac(j) * i
                Catch ex As Exception
                    full = True
                End Try
                If full Then Exit For
            Next
            проверка()
        Next
 
    End Sub
    Private Sub проверка()
        Dim q As Boolean = False
        Do While Not (q)
            If full Then Exit Do
            Dim t As Short = 0
            For m = l To 0 Step -1
                If fac(m) > 9 Then
                    перенос_разряда(m)
                Else
                    t += 1
                End If
                If full Then Exit For
            Next
            If full Then Exit Do
            If t = l + 1 Then q = True
        Loop
    End Sub
 
    Private Sub перенос_разряда(ByVal разряд As Short)
 
        For i = l To разряд Step -1
            If fac(i) > 9 Then
                Dim q As Integer
                q = fac(i)
                fac(i) = 0
 
                For j = 0 To Len(Str(q)) - 1
                    If i - j >= 0 Then
                        fac(i - j) += Val(Str(q).Substring(Len(Str(q)) - 1 - j, 1))
                    Else
                        full = True
                        Exit For
                    End If
                    If full Then Exit For
                Next
            End If
            If full Then Exit For
        Next
 
    End Sub
Добавлено через 1 минуту
Bazzy, моя функция позволяет находить факториал абсолютно любого числа, вопрос лишь во времени. Если есть предложения по эффективности, с радостью приму.
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
26.07.2011, 16:38 10
probit, а зачем такие извращения - перенос разрядов, проверка чего-то и все такое?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 16:49 11
Цитата Сообщение от probit Посмотреть сообщение
Bazzy, какова величина переменной Big integer?
BigInteger обломится на факториале 9999!, а то может быть и раньше, точный предел не определял
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
26.07.2011, 17:02 12
Тип BigInteger является постоянным типом, который представляет сколь угодно большое целое число, значение которого теоретически не имеет верхнего или нижнего предела. Элементы типа BigInteger близки к элементам других целочисленных типов (типов Byte, Int16, Int32, Int64, SByte, UInt16, UInt32 и UInt64). Этот тип отличается от других целочисленных типов в .NET Framework, диапазон которых указывается их свойствами MinValue и MaxValue
- msdn , по-моему, тут основное ограничение - это размер свободной памяти
0
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
26.07.2011, 18:45  [ТС] 13
Eugene22, из-за своей неопытности я не знал о такой переменной=) считай я создал собственную переменную. А наворочено всего, так как я пользовался не стандартными функциями а как бы сам придумал велосипед. Число разбивается на цифры в массив, далее на каждую цифру умножается новое число, и работает перенос разрядов, если в элементе массива число более 9. Только проблема в быстро действии. Ты не проверял свою функцию на время, сколько факториал 3000 находится?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
26.07.2011, 21:21 14
Это только для избранных - а именно тех, кто пользуется .NET 4.0
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 23:37 15
Цитата Сообщение от probit Посмотреть сообщение
Ты не проверял свою функцию на время, сколько факториал 3000 находится?
поверьте, быстрее чем ваш
0
196 / 188 / 15
Регистрация: 09.02.2011
Сообщений: 457
27.07.2011, 00:08 16
5000 вроде 40мс под рукой студии нет, завтра могу сказать поточнее
0
Почетный модератор
21415 / 9150 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
27.07.2011, 00:11 17
Я посоветую всем тут присутствующим не забывать о том, что далеко не у всех используется NET Framework4, и конструкция с Big integer мягко говоря, не пролазит.

Maxwe11, поубавь свой гонор.

probit старается и пишет, улучшает раздел, не смотря на то, что новичок.
2
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
28.07.2011, 02:58 18
Я тоже написал что то подобное. Моя программа просто принимает две строки и умножает их. Просто алгоритм имитирует обычную умножению. Вот:
Вложения
Тип файла: rar MegaCalc.rar (7.9 Кб, 16 просмотров)
0
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
28.07.2011, 06:11  [ТС] 19
smallvill, ты на какой переменно писал? Big integer? или как я массив? поделишься функциями, интересно.
0
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
29.07.2011, 14:34 20
Цитата Сообщение от probit Посмотреть сообщение
smallvill, ты на какой переменно писал?
Я использовал переменных String и наверно знаете что в фреймворк 2.0 переменная String может иметь длину на 2ГБ. Но поскольку это в этой программе результат тоже присваывается на Textbox.text ( это тоже string), тогда можно только умножать чисел длинной на 1GB.
0
29.07.2011, 14:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2011, 14:34
Помогаю со студенческими работами здесь

Найти сумму ряда S с точностью до члена ряда, по абсолютной величине меньшего eps
найти сумму ряда S с точностью до члена ряда, по абсолютной величине меньшего eps = 0.0001. в чем...

Вычисления суммы ряда с точностью до члена ряда, не превышающего по абсолютной величине 0,001
Помогите пожалуйста с решением задачи, заранее спасибо!!! Составьте программу (на...

Извлекаем данные из файла
Доброе время суток. Заинтересовал вопрос. допустим имеем файл с 3д моделью, анимацией и всеми ее...

Извлекаем комментарии с booking.com, используя urlopen()
Доброго времени суток! Создавал похожую тему, но вдругом разделе. Ошибся... Написал следующий код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru