Python 为什么这些基本转换器给出不同的答案?

Python 为什么这些基本转换器给出不同的答案?,python,base,base-conversion,Python,Base,Base Conversion,我编写了一个python程序,将数字从任意正整数基转换为另一个正整数基 print("Base Converter") from math import log print("This converter uses 0-9, followed by A-Z, followed by a-z, giving it individual characters from 0 - 61.") print("If there are digits greater than 61, each digit w

我编写了一个python程序,将数字从任意正整数基转换为另一个正整数基

print("Base Converter")
from math import log
print("This converter uses 0-9, followed by A-Z, followed by a-z, giving it individual characters from 0 - 61.")
print("If there are digits greater than 61, each digit will be placed in a pair of vertical lines, eg. 4|A|c|X|63|2|H|144|H.")
def BaseConvert(number, StartBase, EndBase):
    try: # Make sure that the parameters are in the right format
        n = int(str(StartBase)) + int(str(EndBase))
    except ValueError:
        return "Bad Base input"
    StartBase, EndBase = int(StartBase), int(EndBase)
    letters = ['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','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']

    number = str(number)
    for i in number: # Make sure that all the digits are alphanumeric
        if not i.isalnum() and i != "|": # Vertical bars are allowed as they seperate digits greater than 61. Other non alphanumeric characters are not.
            return "Bad input"
    if "|" in number:
        number = number.split("|")
    StartLength = len(number) # Initial length of number
    total = 0 # This will become the final number
    for i in range(StartLength):
        n = StartLength - i - 1 # This effectively reverses the order,
        Digit = number[n]       # going from the last digit in the number (furthest to the right), to the first.
        if Digit in letters:
            Digit = letters.index(Digit) + 10
        try:
            Digit = int(Digit)
        except ValueError:
            return "Bad Number Input"
        if Digit > StartBase:
            return "Bad start base"
        total += int(Digit) * (StartBase ** i)
    number = total
    if EndBase > 1:
        n2 = int(log(number, EndBase)) # Length of result number
    elif EndBase == 1:
        n2 = number
    else:
        print("Unable to complete base conversion")
        return
    total = number
    numbers = []
    J = ""
    for i in range(n2 + 1):
        X = int(total/(EndBase ** (n2 - i))) # Starting from the largest place value, divides the original number (Now in base 10) by the place value
        if X > 9:
            if X < 62:
                X = letters[X - 10]
            else:
                X = str(X)
                J = "|"
        numbers.append(str(X))
        total = total % EndBase ** (n2 - i)
    EndNumber = J.join(numbers)
    return EndNumber
#     Base Conversion Function  /\ /\
#     User input \/ \/ \/ \/ \/ \/ \/
print("Enter your number, start base and end base. (eg. 101101011, 2, 10) ")
inp = "1"
while inp:
    inp = input(">>> ")
    while inp.count(",") != 2:
        if inp == '':
            break
        print("Bad input")
        inp = input(">>> ")
    if inp == '':
        break
    inp = inp.split(",")
    print(BaseConvert(inp[0].strip(), inp[1].strip(), inp[2].strip()))
打印(“基本转换器”)
从数学导入日志
打印(“此转换器使用0-9,后跟A-Z,后跟A-Z,为其提供0-61之间的单个字符。”)
打印(“如果有大于61的数字,则每个数字将放置在一对垂直线中,例如4 | a | c | X | 63 | 2 | H | 144 | H.)
def BaseConvert(数字、起始基、结束基):
try:#确保参数的格式正确
n=int(str(StartBase))+int(str(EndBase))
除值错误外:
返回“坏基输入”
StartBase,EndBase=int(StartBase),int(EndBase)
此外,亦有“H”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“香港”、“香港”、“香港”、“香港”、“香港”、“我”、“我”、“我”、“我”、“J”、“我”、“香港”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“”、“我”、“我”、“他们”、“我”、“他们”、“”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“我”、“”、“我”、“”、“,'V','W','X','Y','Z']
编号=str(编号)
对于数字i:#确保所有数字都是字母数字
如果不是我,伊萨努姆()和我!=“|”:#允许使用竖条分隔大于61的数字。其他非字母数字字符不可用。
返回“错误输入”
如果数字为“|”:
编号=编号。拆分(“|”)号
长度=长度(数字)#数字的初始长度
总数=0#这将成为最终数字
对于范围内的i(惊人长度):
n=惊人长度-i-1#这实际上颠倒了顺序,
数字=数字[n]#从数字的最后一位(最右边)到第一位。
如果数字为字母:
数字=字母。索引(数字)+10
尝试:
数字=整数(数字)
除值错误外:
返回“错误数字输入”
如果数字>起始数据库:
返回“坏的开始基数”
总计+=整数(位数)*(起始基数**i)
数字=总数
如果EndBase>1:
n2=int(对数(数,尾基))#结果数的长度
elif EndBase==1:
n2=数量
其他:
打印(“无法完成基本转换”)
返回
总数=个数
数字=[]
J=“”
对于范围(n2+1)内的i:
X=int(total/(EndBase**(n2-i))#从最大的位值开始,将原始数字(现在以10为基数)除以位值
如果X>9:
如果X<62:
X=字母[X-10]
其他:
X=str(X)
J=“|”
数字。追加(str(X))
总计=总百分比端基**(n2-i)
EndNumber=J.join(数字)
返回端号
#基本转换函数/\/\
#用户输入\/\/\/\/\/\/\/
打印(“输入您的号码、起始基数和结束基数(例如101011、2、10)”)
inp=“1”
而inp:
inp=输入(“>>>”)
而输入计数(“,”)=2:
如果inp='':
打破
打印(“错误输入”)
inp=输入(“>>>”)
如果inp='':
打破
inp=inp.拆分(“,”)
打印(BaseConvert(inp[0].strip(),inp[1].strip(),inp[2].strip())
为了检查我的结果是否正确,我在网上找到了一些基本转换器来测试,并插入了大量的数字,但注意到不同的计算器给出了不同的结果

我很确定我的程序是正确的,我不确定,但我已经做了一些手动转换,它们与程序比较好,但是为什么这些计算器得到不同的值


给十进制数字以0结尾的网站可能只是内存不足,或者使用了一种语言或算法,无法很好地处理大数字。请记住,基36中的第一个
B
已经是基10中的
40845122120202252076284091826176
。考虑到网站被许多人访问,他们必须谨慎地管理他们的资源,以确保人们不会经历延迟。该网站很可能只是限制了每次计算可以使用的内存量

我自己的基本转换器程序的结果:

Ruby Base Converter
Convert from base: 36
Number in base 36: BIGNUMBERTESTEXAMPLE
Convert to base: 10
Base 36: BIGNUMBERTESTEXAMPLE
Base 10: 4274945873844657616917501294866

我的结果与第一个结果相符。

我认为那一个是这样的,至于我在描述中写的正确的一个,它与我得到的结果相符,但图片上似乎什么也没有显示,可能是我格式化错误了。谢谢你的回答。