(上)を説明するためのコースモジュールの三つのPythonプログラミングの問題

@

    次は、私はあなたが任意のより良い解決策を持っている場合は、私にはプライベートの手紙をしてください、ソリューション・パイソンのコースを勉強していますトピックのいくつかをご紹介します。ここではタイトルだけとコードが表示されます。

1.ハッピーデジタル

   説明:数があるかどうかを判断するためのアルゴリズムを書く「幸せ。」次のように幸せな図形が決定される無限数のそれぞれ正方形および置換基の数と、正の整数から出発して、処理を繰り返し、最終的なデジタルコンバージェンス又は1に等しく、1に等しいがされるまで、または意志サイクルそして最終的には1に等しい収束に行くことはありません。図1は、最終的な収束の数はハッピー数で等しくすることができます。以下の場合の例:

19は幸せ数です以下のように、計算されます。


1 ^ 2 + 9 ^ 2 = 82

8 ^ 2 + 2 ^ 2 = 68

6 ^ 2 + 8 ^ 2 = 100

1 ^ 2 + 0 ^ 2 + 0 ^ 2 = 1


幸せ、出力はTrue、それ以外の場合はFalseを出力する場合、入力はデジタル。

   著者コード:再帰をすることができます。

a = input('')
def num(a):
    sum = 0
    for i in list(a):
        sum += int(i)**2
    try:
        if sum != 1:
            num(str(sum))
        else:
            print('True')
    except:
        print('False')


result = num(a)


2.シーザー暗号I

   説明:シーザー暗号ローマのジュリアス・シーザーは、すなわち、文字のアルファベット列の後ろの3番目の文字で各英語の文字サイクルについては、別の方法を使用して軍事情報の暗号化アルゴリズム、にするために使用されますアルファベットとの対応は以下のとおりです。

原文:ABCDEFGHIJKLMNOPQRSTU VWXYZ
文:DEFGHIJKLMNOPQRSTUVWX YZABC

元の文字Pのために、以下の条件を満足する文字暗号文C:C =(P + 3)MOD 26

上記すなわち、シーザー暗号の暗号化方法、復号化方法及びその逆である:P =(C-3)MOD 26

   ユーザーが入力のみ〜zの小文字、スペースを含んで使用することができていると、プログラム、入力文字列シーザー暗号の暗号化、スペースが暗号化されていないダイレクト出力を、書きます。入力を取得する入力()を使用。

著者の   コード:異なった基準に従って判断しました。

my_str = input("")
result = ""
for i in my_str:
    if i != my_str[-1] and i not in ['x','y','z']:
        result += chr(int(ord(i)) + 3 % 26)
    elif i == my_str[-1]:
        result += chr(int(ord(i)) + 3 % 26)
    elif i in ['x','y','z']:
        result += chr(int(ord(i)) - 23)
print(result.replace('#',' '))


3.シーザー暗号II

   説明:シーザー暗号シーザー文字列の後に第三のアルファベット文字で英語の文字情報の各サイクルのための別の方法を使用して暗号化と復号化アルゴリズム、ローマの軍事情報、次のようにそれは、対応関係のアルファベットであります:

原文:ABCDEFGHIJKLMNOPQRSTU VWXYZ

密文:DEFGHIJKLMNOPQRSTUVWX YZABC

元の文字Pのために、以下の条件を満足する文字暗号文C:C =(P + 3)MOD 26

上記すなわち、シーザー暗号の暗号化方法、復号化方法及びその逆である:P =(C-3)MOD 26

   ユーザーが入力を使用することを想定のみの手紙が含まれている、すなわち、英語の小文字の手紙〜は10zA〜Z、特殊文字、プログラム、入力文字列シーザー暗号の暗号化、特殊文字が暗号化されていない請求項の直接出力を書きます処理。

著者の   コード:判断がASCIIの範囲内とすることができるかどうかによって異なります。

my_str = input("")
result = ""
for i in my_str:
    if i != my_str[-1] and i not in ['x','y','z','X','Y','Z'] and (65 <= int(ord(i)) <= 90 or 97 <= int(ord(i)) <= 122):
        result += chr(int(ord(i)) + 3 % 26)
    elif i == my_str[-1] and (65 <= int(ord(i)) <= 90 or 97 <= int(ord(i)) <= 122):
        result += chr(int(ord(i)) + 3 % 26)
    elif i in ['x','y','z','X','Y','Z']:
        result += chr(int(ord(i)) - 23)
    else:
        result += i
print(result.replace('#',' '))


4.ブラケット検出器対

   説明:ユーザーは、成功出力をペアリング、括弧が正しく対になっているかどうかをチェックし、カッコ()を含むことができる彼の文字列を、入力します:

ペアリングが成功すると、失敗したペアリング

前記)(すなわち、配列を一致検討する括弧を一対のペアを示す)(のみ括弧を考慮ペア、ペアではありません。

これはOJトピックであることに注意してください、入力(「」)を使用して入力を取得。


著者   コード: C言語を使用すると、簡単な方法を使用することはできませんスタックで使用することができます

# 把每一个的右括号的值的位置放进去
def everyRight(right,a):
    # 找到该右括号左边的最近左括号的序列号
    for j in a:
        if j - right < 0:
            m = j
    return m


my_str = input("")
my_list = list(my_str)
a = [];b = []
for i in range(0,len(my_list)):
    if '(' == my_list[i]:
        a.append(i)
    elif ')' == my_list[i]:
        b.append(i)

s1 = [];s2 = []
i = 0
try:
    while 1:
        # 递归,首先,先找到第一个右括号和第一个左括号,找到后,就去除,然后递归
        left = everyRight(b[i],a)
        right = b[i]
        s1.append(left)
        s2.append(right)
        # 删除上一次左括号对应的序号,并将下一次的右括号和左括号调用函数
        a.pop(left)
        everyRight(b[i+1],a)
        i = i+1
except:
    pass

try:
    if len(s1) == len(s2) and len(s1) !=0 and len(a) != 1:
        print('配对成功')
    else:
        print('配对不成功')
except:
        print('配对不成功')

しかし、この方法は、次の出力中などに問題があります。

これはなぜ起こるのでしょうか?私たちは、次のような出力を見て:

   最後に停止し、その後、左と右括弧の数に応じて判断すると、この時間は、括弧が停止します左右カッコを満たしていない遭遇したときのミスが、私たちは私たちのリストが削除され、削除する値です。
コードは以下の通りであります:

# 把每一个的右括号的值的位置放进去
def everyRight(right,a):
    # 找到该右括号左边的最近左括号的序列号
    for j in a:
        if j - right < 0:
            m = j
    return m


my_str = input("")
my_list = list(my_str)
a = [];b = []
for i in range(0,len(my_list)):
    if '(' == my_list[i]:
        a.append(i)
    elif ')' == my_list[i]:
        b.append(i)

s1 = [];s2 = []
i = 0
try:
    while 1:
        # 递归,首先,先找到第一个右括号和第一个左括号,找到后,就去除,然后递归
        left = everyRight(b[i],a)
        right = b[i]
        s1.append(left)
        s2.append(right)
        print('right{0}'.format(right))
        # 删除上一次左括号对应的序号,并将下一次的右括号和左括号调用函数
        a.pop(left)
        # 删除列表对应的值
        my_list.remove(my_list[left])
        my_list.remove(my_list[right])
        everyRight(b[i+1],a)
        i = i+1
except:
    pass

# print(s1)
# print(s2)
# print(a)
# print(len(a))
# print(my_list)

a1 = my_list.index(')')
a2 = my_list.index('(')

try:
    if len(s1) == len(s2) and len(s1) !=0 and a2 < a1:
        print('配对成功')
    else:
        print('配对不成功')
except:
        print('配对不成功')

しかし、まだエラーがあります:

しかし、我々は正しい答え、私が説明します改善次のブログの完全なコードに近いです。

おすすめ

転載: www.cnblogs.com/ITXiaoAng/p/11600978.html