Python経典基礎プログラミング練習問題(四)——毎日10題


1.スコアシーケンスがあります:2/1、3/2、5/3、8/5、13/8、21/13...この数列の上位20項の和を求める
解題構想:分子分母の法則に注意する
a = 2.0
b = 1.0
s = 0
for n in range(1,21):
    s += a / b
    t = a
    a = a + b
    b = t
print (s)

2.1+2!+3!+...+20!の和
n = 0
s = 0
t = 1
for n in range(1,21):
    t *= n
    s += t
print ('1! + 2! + 3! + ... + 20! = %d' % s)

3.再帰的な方法で5を求める!
sum=0
def digui(n):
    if n==0:
        sum=1
    else:
        sum=n*digui(n-1)
    return sum

print(digui(5))

4.再帰関数呼び出し方式により、入力したn文字を逆の順序で印刷する
def out(s,n):
    if n == 0:
        return
    else:
        print(s[n-1],end=' ')
        out(s,n-1)

s=input('   :')
#s=s.split(',')
n= len(s)
out(s,n)

5.5人が一緒に座って、5人目は何歳ですか.彼は4人目より2歳年上だと言った.4人目の年齢を聞くと、3人目より2歳年上だという.3人目に聞くと、2人目より2歳年上だという.2人目に聞くと、1人目より2歳年上だという.最後に最初の人に聞いて、彼は10歳だと言った.5人目はおいくつですか
解題の考え方:再帰
def age(n):
    if n == 1:
        a=10
    else:
        a=age(n-1)+2
    return a
print(age(5))

6.5桁以下の正の整数を与えて、要求:一、それが何桁であることを求めて、二、逆順に各位の数字を印刷します
問題を解く構想:スタックの思想を使う
def jisuan(n):
    l=[]
    while n!=0:
        a=n%10
        l.append(a)
        n=n//10
    return l

n=int(input('   :'))
l=jisuan(n)
a= len(l)
for i in range(a):
    print(l[i],end=' ')

7.1つの5桁の数が返信数かどうかを判断する
str=input('   :')
a=int(str)
t=1
for i in range(5//2):
    if str[i] != str[5-i-1]:
        t=0
        break
if t:
    print('%d       ' % a)
else:
    print('%d        ' % a)

8.指定されたフォーマットの日付を出力
解題の考え方:datetimeの方法を理解する
import datetime

if __name__ == '__main__':
    #       ,    dd/mm/yyyy。         strftime()   
    print(datetime.date.today().strftime('%d/%m/%Y'))

    #       
    miyazakiBirthDate = datetime.date(1998,3,18)

    print(miyazakiBirthDate.strftime('%d/%m/%Y'))

    #       
    miyazakiBirthNextDay = miyazakiBirthDate + datetime.timedelta(days=1)

    print(miyazakiBirthNextDay.strftime('%d/%m/%Y'))

    #     
    miyazakiFirstBirthday = miyazakiBirthDate.replace(year=miyazakiBirthDate.year + 1)

    print(miyazakiFirstBirthday.strftime('%d/%m/%Y'))

9.2つの卓球チームが試合を行い、それぞれ3人ずつ出た.甲チームはa,b,cの3人,乙チームはx,y,zの3人である.抽選で試合のリストが決まる.選手に試合のリストを聞く人がいる.aは彼がx比と合わないと言って、cは彼がxと合わないと言って、z比、プログラムを作って3チームの選手のリストを見つけてください.
問題を解く構想:3層の循環を利用して、それぞれa,b,cの3人を代表して(x,y,z)の中からそれぞれ1人を選んで、問題の中の条件を利用します.
t=0
for i in range(ord('x'),ord('z') + 1):#a  
    for j in range(ord('x'),ord('z') + 1):#b  
        if i != j:
            for k in range(ord('x'),ord('z') + 1):#c  
                    if (i != ord('x')) and (k != ord('x')) and (k != ord('z')):#  a  x,c  x z
                        print('order is a -- %s\t b -- %s\tc -- %s' % (chr(i), chr(j), chr(k)))
                        t=1
                        break
        if t==1:
            break
    if t==1:
        break

10.曜日の最初のアルファベットを入力して曜日を判断し、最初のアルファベットが同じであれば、2番目のアルファベットを判断し続けてください.
letter = input("please input:")
if letter == 'S':
    letter = input("please input second letter:")
    if letter == 'a':
        print('Saturday')
    elif letter == 'u':
        print('Sunday')
    else:
        print('data error')

elif letter == 'F':
    print('Friday')

elif letter == 'M':
    print('Monday')

elif letter == 'T':
    letter = input("please input second letter:")

    if letter == 'u':
        print('Tuesday')
    elif letter == 'h':
        print('Thursday')
    else:
        print('data error')

elif letter == 'W':
    print('Wednesday')
else:
    print('data error')