코스 모듈 세 파이썬 프로그래밍 문제 (에) 설명하기

@

    다음으로 우리는 주제 당신이 나에게, 제발 개인 편지 어떤 더 나은 솔루션이있는 경우 나, 솔루션 파이썬 과정을 배우고 몇 가지를 소개합니다. 여기에 단지 제목과 코드를 표시합니다.

1. 해피 디지털

   설명 : 숫자인지 확인하는 알고리즘을 쓰기 "행복입니다." 어떤 수의 각 및 치환체의 수와, 양수부터 1과 동일한 1과 동일한 최종 디지털 컨버전스 또는까지 과정을 반복되었거나 뜻 사이클 끝없이 : 행복도는 다음과 같이 결정된다 궁극적으로 1과 동일 수렴하지 않습니다. 도 1은 최종 수렴 수가 행복 개수와 동일 할 수있다. 들어 예 :

19는 행복 번호입니다 다음과 같이 계산된다 :


(1) ^ 2 + 9 = 82 ^ 2

(8) ^ 2 + 2 ^ 2 = 68

(6) ^ 2 + 8 ^ 2 = 100

(1) ^ 2 + 2 + 0 ^ 0 ^ 2 = 1


때 디지털 행복 입력, 출력 참, 그렇지 않으면 출력 거짓.

   저자 코드 : 재귀가 될 수 있습니다.

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

   설명 : 카이사르 암호 즉, 로마의 줄리어스 시저가 문자 알파벳 순서 뒤에 세 번째 문자와 각 영어 문자 사이클 정보를 다른 방법을 사용하여 군사 정보의 암호화 알고리즘으로 사용되는 알파벳 사이의 대응은 다음과 같습니다 :

原文: ABCDEFGHIJKLMNOPQRSTU VWXYZ
文: DEFGHIJKLMNOPQRSTUVWX YZABC

일본어 문자 P 다음 조건을 만족하는 문자 암호문 C : C = (P + 3) 모드 (26)

상기 인 시저 암호 암호화 방법, 복호화 방법 및 그 반대, 즉 : P = (C-3) 모드 (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) 모드 (26)

상기 인 시저 암호 암호화 방법, 복호화 방법 및 그 반대, 즉 : P = (C-3) 모드 (26)

   입력을 사용할 수 있습니다 사용자가 ~ 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. 브래킷 검출기 쌍

   설명 : 사용자는 성공 출력 페어링 괄호 올바르게 짝하는지, 괄호 ()를 포함 할 수있다 그 문자열을 입력한다 :

페어링이 성공, 실패 페어링

페어링 괄호), 즉, (가) 쌍을 나타내고, 서열 일치 고려하는 상기 (괄호만을 고려 페어링, 짝 없음.

이 주제 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