|
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).
|