Číselná soustava - převod dlouhých čísel   otázka

VB.NET

Dobrý den, řeším problém s převodem čísel z a do jednotlivých číselných soustav. V kódu níže je pár funkcí, pomocí kterých převádím čísla z libovolné soustavy do jiné libovolné soustavy. Zasekl jsem se ale na tom, že při výpočtu převodu narážím na velmi vysoká čísla (třeba 15^16) což samozřejmě vyvolá vyjímkui protože se nevejde ai do datového typu long.

Mohl by mi prosím někdo poradit směr kterým se vydat, abych nebyl datovým typem takto omezen? Předpokládám že budu muset dané číslo nějakým způsobem rozsekat. Napadlo mě ho před převodem nějakým způsobem vydělit aby se zmenšilo a na konci ho zase vynásobit ale zatím jsem bohužel je u úvah.

    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click

        'vstupní a výstupní typ můžé být číselná soustava 2-35

        Dim inputValue As String = Me.inText.Text.Trim
        Dim inputType As Integer = Me.inTypeText.Text.Trim
        Dim outputType As Integer = Me.outTypeText.Text.Trim
        Dim outputValue As String = ""





        inputValue = ConvertToDec(inputValue, inputType)
        If inputValue = "Wrong Input" Then
            Me.outText.Text = "Wrong Input"
            Exit Sub
        End If

        outputValue = ConvertFromDec(inputValue, outputType)


        Me.outText.Text = outputValue




    End Sub



    Function ConvertToDec(ByVal inputValue As String, ByVal inputType As Integer)

        Dim number As String
        Dim result As ULong


        number = inputValue.Trim.ToUpper


        For i As Integer = 0 To number.Length - 1

            Dim intTmp As ULong
            Dim tmpPower As ULong


            If ULong.TryParse(number.Substring(i, 1), intTmp) = False Then
                intTmp = StringToNumber(number.Substring(i, 1), inputType)

                If intTmp = 0 Then
                    Return "Wrong Input"
                End If
            End If


            tmpPower = (number.Length - 1) - i
            result = result + (intTmp * (inputType ^ tmpPower))

        Next

        Return (result)

    End Function




    Function ConvertFromDec(ByVal inputValue As ULong, ByVal outputType As Integer) As String

        Dim result As String = ""


        While inputValue > 0
            Dim tmp As Integer = (inputValue Mod outputType)

            If outputType > 10 And tmp >= 10 Then
                result = result & NumberToString(tmp)
            Else
                result = tmp & result
            End If

            inputValue = inputValue \ outputType
        End While

        Return (result)


    End Function


    Function StringToNumber(ByVal input As String, ByVal inputType As Integer) As Integer

        Dim alphabetString() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
        If inputType - 11 >= alphabetString.Length Then Return 0 'kontrola abych se nedostal mimo rozsah pole

        For i As Integer = 0 To inputType - 11
            If input = alphabetString(i) Then Return i + 10
        Next

        Return 0

    End Function


    Function NumberToString(ByVal input As Integer) As String

        Dim alphabetString() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}


        For i As Integer = 0 To input - 10
            If input - 10 = i Then Return alphabetString(i)
        Next

        Return "-"

    End Function

Je to prozatím první nástřel, pak tam udělám ještě nějaké optimalizace (např. místo dvou funkcí kde převádím čísla na text a naopak můžu nahradit dictionary, ale to už jsou detaily které nesouvisejí s problémem).

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback