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

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

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

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

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

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

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

35
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.07.2011, 14:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от smallvill Посмотреть сообщение
Я использовал переменных String и наверно знаете что в фреймворк 2.0 переменная String может иметь длину на 2ГБ. Но поскольку это в этой программе результат тоже присваывается на Textbox.text ( это тоже string), тогда можно только умножать чисел длинной на 1GB.
использование строк для таких вычислений не эффективно, достаточно массива байтов - byte[]
0
 Аватар для probit
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
29.07.2011, 15:03  [ТС]
Maxwe11, я таким способом и делал.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.07.2011, 15:13
Цитата Сообщение от probit Посмотреть сообщение
Maxwe11, я таким способом и делал.
а ограничение на 3200 ? значит где-то косяк раз долго считает
0
 Аватар для probit
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
29.07.2011, 15:16  [ТС]
но проблема в том, что массива байтов не хватает. Дело в том, что при умножении первый множитель умножается на каждый разряд второго множителя. Допустим первый множитель у нас равен 255, а второй любая цифра. Получается, мы при умножении выходим за границы. Для факториала может ещё подойти short, ну а для супер умножения, только integer или даже long. Вся память и уходит на это. И ещё не малую часть памяти забирает функция переноса разряда.

Добавлено через 1 минуту
Maxwe11, вот я и не могу сделать её эффективнее. В принципе можно любое число, но с 3 к считает 10 мин, это достаточно плохой показатель. Косяк найти не могу.

Добавлено через 48 секунд
Maxwe11, может взглянешь класс? на первой странице данной темы.
0
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
29.07.2011, 16:01
probit, советую тебе написать библу с новой переменной, что бы можно было написать
VB.NET
1
Dim a As Probit
, а потом, чтобы можно было писать что-то в этом духе
VB.NET
1
Dim b As Probit = a * a
0
 Аватар для probit
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
29.07.2011, 16:10  [ТС]
Ciberst, разъясни поподробней, пожалуйста.
0
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
29.07.2011, 16:38
Взял небольшой кусок из BigInteger, писать его с нуля для 3.5 Framework мне лень и времени нет и не факт, что получится еще.
Код

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
93
94
95
96
97
98
99
100
101
102
Public Structure Ciberst
    ' Implements IFormattable, IComparable, IComparable(Of Ciberst), IEquatable(Of Ciberst)
    Friend _sign As Integer
    Friend _bits As UInt32()
    Private Shared ReadOnly s_bnMinInt As Ciberst
    Private Shared ReadOnly s_bnOneInt As Ciberst
    Private Shared ReadOnly s_bnZeroInt As Ciberst
    Private Shared ReadOnly s_bnMinusOneInt As Ciberst
    Private Const knMaskHighBit As Integer = -2147483648
    Private Const kuMaskHighBit As UInt32 = &H8000000
    Private Const kcbitUint As Integer = &H20
    Private Const kcbitUlong As Integer = &H40
    Private Const DecimalScaleFactorMask As Integer = &HFF0000
    Private Const DecimalSignMask As Integer = -2147483648
 
    Public Shared ReadOnly Property Zero() As Ciberst
 
        Get
            Return Ciberst.s_bnZeroInt
        End Get
    End Property
 
    Public Shared ReadOnly Property One() As Ciberst
 
        Get
            Return Ciberst.s_bnOneInt
        End Get
    End Property
 
    Public Shared ReadOnly Property MinusOne() As Ciberst
        Get
            Return Ciberst.s_bnMinusOneInt
        End Get
    End Property
 
    Public ReadOnly Property IsZero() As Boolean
        Get
            Return (Me._sign = 0)
        End Get
    End Property
 
    Public ReadOnly Property IsOne() As Boolean
        Get
            Return ((Me._sign = 1) AndAlso (Me._bits Is Nothing))
        End Get
    End Property
 
    Public ReadOnly Property IsEven() As Boolean
        Get
            If (Not Me._bits Is Nothing) Then
                Return ((Me._bits(0) And 1) = 0)
            End If
            Return ((Me._sign And 1) = 0)
        End Get
    End Property
 
    Public ReadOnly Property Sign() As Integer
        Get
            Return ((Me._sign >> &H1F) - (-Me._sign >> &H1F))
        End Get
    End Property
 
    Public Overloads Shared Operator +(ByVal left As Ciberst, ByVal right As Ciberst) As Ciberst
        If Right.IsZero Then
            Return left
        End If
        If Left.IsZero Then
            Return right
        End If
 
        Return New Ciberst(left._sign + right._sign)
    End Operator
    Public Overloads Shared Operator =(ByVal left As UInt64, ByVal right As Ciberst) As String
        Return right.Equals(left)
    End Operator
    Public Overloads Shared Operator <>(ByVal left As UInt64, ByVal right As Ciberst) As String
        Return Not right.Equals(left)
    End Operator
 
 
    Public Sub New(ByVal value As Long)
        If ((-2147483648 <= value) AndAlso (value <= &H7FFFFFFF)) Then
            If (value = -2147483648) Then
                'Me = Ciberst.s_bnMinInt
            Else
                Me._sign = CInt(value)
                Me._bits = Nothing
            End If
        Else
            Dim num As UInt64 = 0
            If (value < 0) Then
                num = CULng(-value)
                Me._sign = -1
            Else
                num = CULng(value)
                Me._sign = 1
            End If
            Me._bits = New UInt32() {DirectCast(CUInt(num), UInt32), DirectCast((CUInt(num) >> &H20), UInt32)}
        End If
    End Sub
 
End Structure

что умеет этот код? в общем это не нужный велосипед, показывающий, как создавать свои переменные
VB.NET
1
2
   Dim b As New Ciberst(1000)
        b = b + b
2
Почетный модератор
 Аватар для Памирыч
23253 / 9167 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
29.07.2011, 18:04
smallvill, ну так ты будешь делиться исходниками? Люди же просят.

Maxwe11, сильно принципиально НЕ использовать строки? Вроде код smallvill считает немедленно, вопрос в том, что одно умножение считается быстро, а как будет обстоять дело с циклом умножений.

Ciberst, фишка хорошая, но в этой теме она не решает вопроса, хотя, возможно, и дает кой-какие идеи автору
0
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
29.07.2011, 18:23
Сейчас у меня нет исходника но даю слова что будет. В данное время ест Basic вариант. Немного изменений и будет VB .Net вариант:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CLS
INPUT a$
INPUT b$
s = 0
n = LEN(a$)
m = LEN(b$)
IF m >= n THEN SWAP a$, b$: SWAP m, n
d$ = STRING$(m + n, "0")
FOR i = m TO 1 STEP -1
FOR k = m + n TO 1 STEP -1
FOR j = n TO 1 STEP -1
s = s + VAL(MID$(d$, k, 1)) + VAL(MID$(a$, i, 1)) * VAL(MID$(b$, j, 1))
l = INT(s / 10)
f = s - l * 10
s=l
NEXT j
MID$(d$, k, 1) = STR$(f)
NEXT k
NEXT i
PRINT d$
END
Добавлено через 5 минут
.НЕТ вариант напишу снова.

Добавлено через 15 секунд
.НЕТ вариант напишу снова.
0
 Аватар для probit
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
29.07.2011, 23:04  [ТС]
Ciberst, слишком тяжко для меня(
0
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
30.07.2011, 12:02
Вот исходник который обещал:
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
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
 
        Dim a As String, b As String, c As String = ""
 
        Dim m As Integer, n As Integer, k As Integer, _
 i As Integer, j As Integer
 
        a = TextBox1.Text
        b = TextBox2.Text
 
        m = a.Length
        n = b.Length
 
        Dim masA(m + 1) As Byte
        Dim masB(n + 1) As Byte
        Dim masC(m + n) As UShort
 
        For i = m To 1 Step -1
            masA(i) = a.Substring(i - 1, 1)
        Next
 
        For j = n To 1 Step -1
            masB(j) = b.Substring(j - 1, 1)
        Next
        
        For k = m + n To 2 Step -1
            For i = m To 1 Step -1
                For j = n To 1 Step -1
                    If i + j = k Then
                        masC(k) = masC(k) + masA(i) * masB(j)
                    End If
                Next
            Next
 
            masC(k - 1) = masC(k - 1) + Int(masC(k) / 10)
            masC(k) = masC(k) - Int(masC(k) / 10) * 10
 
        Next
        
        For k = 1 To m + n
            c = c & masC(k).ToString
 
        Next
 
        If c.Substring(0, 1) = "0" Then c = c.Remove(0, 1)
        TextBox3.Text = c
 
    End Sub
      
    Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Label1.Text = TextBox1.Text.Length
    End Sub
 
    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Label2.Text = TextBox2.Text.Length
    End Sub
 
    Private Sub TextBox3_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
        Label3.Text = TextBox3.Text.Length
    End Sub
End Class
Добавлено через 7 часов 23 минуты
probit! Естественно моя программа работает примерно 2 или 2.5 раза медленно. Например извлечение факториала числа 2840 тянет 24 минуты у меня. Может немного зависет от частоты процессора, объёма памяти, частоты памяти и т. д. Можно спросить каковы у вас характеристикы компютера?

Добавлено через 1 минуту
И ещё. Я написал программу для факториала с помощю того же программы (умножения).
0
 Аватар для probit
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
30.07.2011, 12:45  [ТС]
Intel(R) Pentiup(R) CPU G6950 2.80 GHz оперативка 3 Гб 64 разряда.

Добавлено через 5 минут
smallvill, посмотрел твой код: слишком уж он наворочен циклами. Не забывай про основное правило программиста: используй метод инкапсуляции (распределяй возможные функции на более мелкие, используй как можно меньше переменных, и также использую такой дар visual basic , как редактирование области видимости переменных)
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
30.07.2011, 13:02
probit, да тут уже выкладывали ...вычисление факториала ЛЮБОЙ величины. Используется вектор. и игра с целочисленными типами. Я тогда скажем так был удивлен. Человек отлично знает свойства базовых типов и их применение. Факториал 1000 считает какие то секунды. 10000 - уже подольше. а прога то сама - 2-3 функции. Сравнивал со своим творением. У меня был класс(как в задании просили) который принимал стринг и давал результат в стринге. Но в силу неопытности он катастрофически медленно работал, хотя считал так же факториал любой величины.

а черт это раздел бэйсик. сорри. Я не туда залез. Я про с++
0
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
05.08.2011, 13:53
probit А можно вы поделитесь исходником в текстовом формате? А то у меня Студио 2010 и не могу увидеть полный код. Видно только готовые методы.

Добавлено через 7 минут
И ещё не могу использовать тип БигИнтегер корректно. Использую System.Numerics.Biginteger. Но возникает ошибка перенаполнения.Например как объявлять 2 переменных типа System.Numerics.Biginteger и выводить их сумму? Просто хочу узнать как объявлять и использовать корректно. Заранее спасибо.
0
 Аватар для probit
70 / 63 / 1
Регистрация: 25.04.2011
Сообщений: 181
05.08.2011, 15:12  [ТС]
smallvill, про bidinteger ничего не скажу, сам не в курсах. Код самой dll библиотеки полностью лежит в блокнотике снизу. Учти, что это код для dll, без windows forms он работать не будет.
Вложения
Тип файла: txt factorial.txt (4.7 Кб, 31 просмотров)
0
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 13
05.08.2011, 20:54
Спасибо тебе!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.08.2011, 20:54

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru