Как использовать эквивалент indexof() с biginteger в VB.Net?

Я пытаюсь суммировать цифры в очень большое число. Я получил длину числа с помощью
l = answer.bitLength(), но не могу понять, как увеличивать каждую цифру с помощью цикла For. Есть идеи?

Я использую java.math.biginteger.

Visual Studio 2005 версии 2.0

Я также должен добавить, что я не могу использовать ‹> или любую из простых математических опций с большим целым числом, которое я использую. Если бы кто-нибудь мог сказать мне, как использовать другой biginteger, я был бы более чем готов поменяться местами.

Dim answer As java.math.BigInteger
Dim sum As Integer = 0
Dim x As Integer
Dim i As Integer
'Sets value of answer equal to 1
answer = java.math.BigInteger.valueOf(1)

'gets 100!
For i = 1 To 100
answer = answer.multiply(java.math.BigInteger.valueOf(i))
Next

'gets length of answer
Dim l As Integer
l = answer.bitLength()

'Sums up digits in 100!
For x = 0 To l - 1
'Need to pull each character here to add them all up
Next

Окончательное решение для суммирования цифр. Спасибо Вагеоге.

Dim r As Integer
Dim s As Integer
s = 0
While (answer.compareTo(java.math.BigInteger.valueOf(0)) > 0)

r = answer.mod(java.math.BigInteger.valueOf(10)).ToString()
s = s + r
answer = answer.divide(java.math.BigInteger.valueOf(10))

End While

person Bryan    schedule 25.01.2011    source источник
comment
Что вы пробовали? Можете ли вы опубликовать пример псевдокода того, что вы пытаетесь сделать?   -  person Oded    schedule 25.01.2011
comment
В System.Numerics.BigInteger нет bitLength (или даже BitLength) члена. Вы уверены, что не думаете о Java?   -  person LukeH    schedule 26.01.2011
comment
Я использую java.math.biginteger в VB.Net.   -  person Bryan    schedule 26.01.2011
comment
Почему вы не используете System.Numerics.BigInteger?   -  person wageoghe    schedule 26.01.2011
comment
Если вы используете .Net 4, вы должны использовать тип System.Numerics.BigInteger.   -  person Gabe    schedule 26.01.2011
comment
Я не использую System.Numerics.BigInteger, потому что не могу его понять. Я пытаюсь добавить ссылку, но не вижу предложенного System.Numerics.   -  person Bryan    schedule 26.01.2011
comment
В диалоговом окне «Добавить ссылку» указано «Отфильтровано для: .NET Framework 4» вверху (на вкладке .NET)? Если это так, System.Numerics должен быть там. Пробовали ли вы щелкнуть заголовок «Имя компонента», чтобы отсортировать компоненты по алфавиту?   -  person wageoghe    schedule 26.01.2011
comment
Нет, в имеющемся у меня окне добавления ссылок нет фильтрации текста или каких-либо параметров фильтрации, только вкладки .Net, COM, Projects, Browse и Recent. А под .Net у него просто имя компонента и другие столбцы, ничего больше.   -  person Bryan    schedule 26.01.2011


Ответы (3)


Что-то вроде этого должно работать:

    Dim bi As New System.Numerics.BigInteger(12345)
    Dim c As Char
    Dim s As Long

    s = 0

    For Each c In bi.ToString()
        s = s + Integer.Parse(c.ToString())
    Next

Или этот более традиционный способ с использованием Mod и / (целочисленное деление)

    Dim bi As New System.Numerics.BigInteger(12345)
    Dim s As Long
    Dim r As Integer

    s = 0

    While bi <> 0
        r = bi Mod 10
        s = s + r
        bi = bi / 10
    End While
person wageoghe    schedule 25.01.2011
comment
Кажется, у меня нет доступа к System.Numerics. - person Bryan; 26.01.2011
comment
Вы можете добавить ссылку на сборку (System.Numerics), перейдя в диалоговое окно Project->Properties, перейдите на вкладку Reference, нажмите Add..., найдите System.Numerics и добавьте ее. Я думаю, что я должен добавить, что System.Numerics доступен в .Net 4.0. - person wageoghe; 26.01.2011
comment
Даже с java.math.biginteger вы сможете реализовать что-то из моего второго примера, используя функции разделения и модификации. - person wageoghe; 26.01.2011
comment
Рад, что это сработало. Кстати, если вы используете Visual Studio 2010 (или какой-то вариант 2010 года, например Visual Basic Express 2010 или Visual C# Express 2010), вы сможете где-то найти System.Numerics. Если вы щелкнули заголовок столбца «Имя компонента», чтобы отсортировать столбец «Имя компонента» в алфавитном порядке, и по-прежнему не можете найти System.Numerics, то, я думаю, у вас его нет. - person wageoghe; 26.01.2011

Если вы думаете о числе как о списке двоичных символов, то вы можете получить наименее значащую шестнадцатеричную цифру, AND соединив число с 0xF. Если вы затем сдвинете число вправо на 4 бита (>> 4), то сможете получить следующую шестнадцатеричную цифру.

После того, как вы получите все шестнадцатеричные цифры, вы можете суммировать их, а затем преобразовать их в десятичные числа.

person David Weiser    schedule 25.01.2011

Другой подход состоит в том, чтобы сделать следующее (предполагается, что answer положительно):

int sum = 0;
while(answer > 0){
    sum += answer % 10;
    answer /= 10;
}
person David Weiser    schedule 25.01.2011