-2

Python のコードが非常に遅いことがわかりました。freebasic への 1 分と比較して 8 分を使用して終了します。
誰か最適化を提案してください 。

最初に digit_array["a","b","c","d","e","f","g","h","i","j"] を作成します。
それを割って、余りを求めて、何度も、それを array_index[] に格納し、最後の桁として 1 を指定します。
else if および else コードは、完全でない除算の最後の反復を処理します。
最大インデックスを変数 i として格納します。
次に、array_index を最大値から 1 にループし、それを digit_array にマップしてから
、文字列を生成します (コードはコメントされています)。

追加: 20120903 digit_array から
文字の組み合わせで文字列を作成するためにこれを作成するので、'q' 'z' などの一般的ではない文字や '4' のようないくつかの数字を
スキップできます
digit_array の文字は、a-z+A-Z+0-9+ の
いずれ
かになります。 ','5','6','7','8','9'] , x = 10
digit_array が ['a','b','c','d',' の場合は結果ベースe','f','g','h','i','j'] , x = 10
digit_array が ['0','1','2','3', '4','5','6','7','8'] , x = 9
digit_array が ['0','1','2','3','4','5','6', '7'] , x = 8
これで結果を出力できるようになりましたが、パフォーマンスが低下するだけです

パイソン3コード、

    digit_array=[]
    for i in range(0, 10): # range(10) ----> 0 1 2 3 4 ... 9
        digit_array.append("")
    digit_array[0] = "a"
    digit_array[1] = "b"
    digit_array[2] = "c"
    digit_array[3] = "d"
    digit_array[4] = "e"
    digit_array[5] = "f"
    digit_array[6] = "g"
    digit_array[7] = "h"
    digit_array[8] = "i"
    digit_array[9] = "j"

    array_index=[]
    for i in range(0, 51):
        array_index.append(0)

    currpos = 0
    currpos_end = pow((26+10+1),5)
    #currpos_end = 1024
    print (currpos)
    currpos2 = currpos
    x = 10 # ubound digit_array + 1, ("0","1") binary then x = 2
    print ()

    for currpos in range(currpos, currpos_end):

        currpos2 = currpos
        i = 1

        while True :
            if currpos2 > x:
                array_index[i] = currpos2 % x
                currpos2 = int(currpos2 / x)
            elif currpos2 == x:
                array_index[i] = 0
                i += 1
                array_index[i] = 1
                break
            else:
                array_index[i] = currpos2
                break
            i += 1

        print (i, " . ", currpos, currpos2)

        for j in range(i , 1, -1):
        #    break   #uncomment this and comment next 3 lines for speed testing  
            print (digit_array[array_index[j]], end='')
        print (digit_array[array_index[1]], end='')
        print ()

    try:
        input(".")
    except:
        pass

フリーベーシックコード、

    Dim digit_array(0 To 100) As String
    digit_array(0) = "a"
    digit_array(1) = "b"
    digit_array(2) = "c"
    digit_array(3) = "d"
    digit_array(4) = "e"
    digit_array(5) = "f"
    digit_array(6) = "g"
    digit_array(7) = "h"
    digit_array(8) = "i"
    digit_array(9) = "j"

    Dim array_index(0 To 50) As ULongInt
    For i As Integer = 0 To 50
        array_index(i) = 0
    Next

    Dim As ULongInt currpos
    Dim As ULongInt currpos_end
    Dim As ULongInt currpos2
    Dim As ULongInt x = 10 'ubound digit_array + 1, ("0","1") binary then x = 2
    Dim As ULongInt i

    currpos = 0
    currpos_end = (26+10+1)^5
    'currpos_end = 1024
    Print currpos
    currpos2 = currpos
    Print

    For currpos = currpos To currpos_end

        currpos2 = currpos
        i = 1

        Do
            If currpos2 > x Then
                array_index(i) = currpos2 Mod x
                currpos2 = CULngInt(currpos2 / x)
            ElseIf currpos2 = x Then
                array_index(i) = 0
                i += 1
                array_index(i) = 1
                Exit Do
            Else
                array_index(i) = currpos2
                Exit Do
            EndIf
            i += 1
        Loop

        'Print i; " . "; currpos; " "; currpos2

        '''first = i Until 1 = last
        For j As Integer = i To 1 Step -1
            'Print digit_array(array_index(j));
        Next
        'Print

        'Sleep
    Next

    Print "."
    Sleep
4

2 に答える 2

1

thx任意の基数の整数を文字列に変換する方法は?

def calculation():
    while 1:
        global s, n
        r = n % base
        if r == 0: return
        s = digits[r] + s
        n = n // base
        if n == 0: return

#                  .          .          .
digits = "X0123456789"
digits = "X23456789AJKQ" #first digit not use, remain for calculation
currpos = 0
currpos = 30941 #22222 base13 13^4+13^3+13^2+13+1
#currpos_end = 371292 #QQQQQ base13 13^5-1
currpos_end = pow((26+10+1),5)
currpos_end = 371292
#currpos_end = 1024
base = len(digits)
print (currpos)
print (base)
print ()

for currpos in range(currpos, currpos_end):
    n = currpos
    s = ""
    calculation()
    if s == "":
        continue
    print (s, " . ", currpos, " . ", n)
    #do something here with s
于 2012-09-04T02:47:53.483 に答える
0

楽しみのために、私はあなたがコードで何をしようとしているのかを理解しようとしましたが、あきらめました。

とにかく、ここにあなたのコードのいくつかが少しクリーンアップされています:

digit_array=[
             "a",
             "b",
             "c",
             "d",
             "e",
             "f",
             "g",
             "h",
             "i",
             "j"
             ]

array_index = [0] * 51 

#currpos_end = pow((26+10+1),5)
currpos_end = 1024

x = 10 # ubound digit_array + 1, ("0","1") binary then x = 2
for currpos in range(currpos_end):
    i = 1
    while True :
        if currpos > x:
            array_index[i] = currpos % x
            currpos = int(currpos / x)

        elif currpos == x:
            array_index[i] = 0
            i += 1
            array_index[i] = 1
            break

        else:
            array_index[i] = currpos
            break
        i += 1

result = "".join([digit_array[i] for i in array_index])
print(result)

これにより、次の結果が生成されます。

adcabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
于 2012-09-03T08:16:13.490 に答える