@[TOC] 下麵向大家介紹一下我在學習python課程的一些題目的解法,如果大家有什麼更好的解法請私信我。這裡只顯示題目與代碼。 1.快樂的數字 描述: 編寫一個演算法來確定一個數字是否“快樂”。 快樂的數字按照如下方式確定 ...
目錄
@
下麵向大家介紹一下我在學習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
描述:凱撒密碼是古羅馬凱撒大帝用來對軍事情報進行加解密的演算法,它採用了替換方法對信息中的每一個英文字元迴圈替換為字母表序列中該字元後面的第三個字元,即,字母表的對應關係如下:
原文: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
密文: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
對於原文字元P,其密文字元C滿足如下條件:C=(P+3) mod 26
上述是凱撒密碼的加密方法,解密方法反之,即:P=(C-3) mod 26
假設用戶可能使用的輸入僅包含小寫字母a~z和空格,請編寫一個程式,對輸入字元串進行凱撒密碼加密,直接輸出結果,其中空格不用進行加密處理。使用input()獲得輸入。
作者代碼:根據不同條件判斷即可。
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
描述:愷撒密碼是古羅馬凱撒大帝用來對軍事情報進行加解密的演算法,它採用了替換方法對信息中的每一個英文字元迴圈替換為字母表序列中該字元後面的第三個字元,即,字母表的對應關係如下:
原文: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
密文: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
對於原文字元P,其密文字元C滿足如下條件:C = (P+3) mod 26
上述是凱撒密碼的加密方法,解密方法反之,即:P = (C-3) mod 26
假設用戶可能使用的輸入僅包含西文字母,即英文大小寫字母a~zA~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.括弧配對檢測 A
描述:用戶輸入一行字元串,其中可能包括小括弧 (),請檢查小括弧是否配對正確,配對成功與否分別輸出:
配對成功,配對不成功
其中,小括弧配對要考慮配對順序,即()表示配對,)(不是配對,只考慮小括弧配對。
註意,這是一個OJ題目,獲得輸入使用input("")。
作者代碼: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('配對不成功')
但是還是有錯誤:
但是我們已經接近正確答案了,改進後的完整代碼我會下一篇博客講解。