keep-loving-pythonのブログ

Pythonを愛し続けたいです(Pythonが流行っている限りですが。。。)

『世界標準MIT教科書 Python言語によるプログラミングイントロダクション 第3版』の指練習を解く

『世界標準MIT教科書 Python言語によるプログラミングイントロダクション 第3版』の指練習を解く

指練習の回答、書籍には載ってなかったので。。。自分の回答を示します。
問題自体は示しません。それをガンガン示すと著作権的に宜しくない気がするので。
コードは、pylint, flake8, pycodestyle で、おかしい書き方になっていないことは確認済(一部、UPPER_CASE naming styleとかは無視)。

p7

自分の回答

AスタートでBへのドライブ。

1、車に乗り、エンジンをかける。
2、道路に出る。このとき、Bに近づく向きの道を選ぶ。
3、交差点まで進む。
4、交差点で、Bに近づく向きの道(右折、左折、直進)を選んで、次の項交差点まで進む。
5、Bにつくまで、3、4を繰り返す。

p20

自分の回答

# x, y, z = 100, 5, 23  # 正の整数の条件あり  # 23
x, y, z = 100, 50, 2300  # 正の整数の条件あり  # 50

other_ans = x
max_odd = 0

if x % 2:
    max_odd = x
if y % 2:
    max_odd = max(max_odd, y)
if z % 2:
    max_odd = max(max_odd, z)

if not max_odd:
    max_odd = min(x, y, z)

print(max_odd)

コメント

  • min,maxとかをif文で書いていたりしたのを修正。
  • printが、1か所になるように修正。

p26

自分の回答

# mm/dd/yyyy input
# You were born in the year yyyy.

yyyy_ = input('your birthday ? (mm/dd/yyyy):')

yyyy = yyyy_.split('/')[2]
print('You were born in the year', str(yyyy) + '.')

p29

自分の回答

num_x = int(input('How many times should I print the letter X? '))
to_print = ''
cnt00 = 0
while cnt00 < num_x:
    to_print += 'X'
    cnt00 += 1
print(to_print)

p30

自分の回答

data10 = input('Input 10 positive integers:').split()

out_desu = 'no odd interger.'
val_odd_max = 0

for val in data10:
    print(val)
    int_val = int(val)
    if int_val % 2 and int_val > val_odd_max:
        val_odd_max = int_val

if val_odd_max:
    out_desu = val_odd_max

# print-sentence is only one.
print(out_desu)

p33

自分の回答

bug-fix後

MAX_VALUE1 = 1000
add_value = 0
# upper_limit_a = 1000000  # bug-fix
for a in range(3, MAX_VALUE1, 1):
    upper_limit_a = 1000000  # bug-fix
    not_sosu = 0
    next_a = a
    for va1 in range(2, next_a - 1, 1):
        if va1 >= upper_limit_a:  # bug-fix
            break
        print('va1', a, va1, next_a)
        if a % va1:
            upper_limit_a = a//va1
            print('upper_limit_a', upper_limit_a)
        else:
            not_sosu = 1
            break
    if not_sosu == 0:
        print(a)
        add_value += a

print("add", add_value)
# add 76125

bug-fix前

MAX_VALUE1 = 1000
add_value = 0
upper_limit_a = 1000000
for a in range(3, MAX_VALUE1, 1):
    not_sosu = 0
    next_a = a
    for va1 in range(2, next_a - 1, 1):
        if va1 > upper_limit_a:
            break
        print('va1', a, va1, next_a)
        if a % va1:
            upper_limit_a = a//va1
            print('upper_limit_a', upper_limit_a)
        else:
            not_sosu = 1
            break
    if not_sosu == 0:
        print(a)
        add_value += a

print("add", add_value)
# add 76125

コメント

  • シンプルに難しいです。ちょっと、頭が混乱します。
  • エクセルで、一部確認したので、正しいはず。
  • もっと良い回答があったら、コメント等で教えて下さい。

p40_1

自分の回答

x = int(input('Enter an integer greater than 2: '))
smallest_divisor = None
for guess in range(2, x):
    if x % guess == 0:
        smallest_divisor = guess
        break
if smallest_divisor is not None:
    # print('Smallest divisor of', x, 'is ',smallest_divisor)
    print('Largest divisor of', x, 'is ', x // smallest_divisor)  # modified
else:
    print(x, 'is a prime number')


p40_2

自分の回答

x = int(input('Input an integer :'))

root_val = 0
pwr_val = 0
i_center = x//2

# shikkari-tiisaku
for _ in range(x):
    if i_center * i_center > x:
        i_center = i_center // 2
    else:
        break

for y in range(i_center, x):
    if y * y == x:
        root_val = y
        break
    if x < y * y:
        break

if root_val:
    print('root pow :', y, 2)
elif x == 1:
    print('root pow :', '1 2, 1 3, 1 4,1 5')
elif x == 0:
    print('root pow :', '0 2, 0 3, 0 4,0 5')
else:
    print('No solution')

# ex.
# Input an integer :1173155192332004097316
# root pow : 34251353146 2

コメント

  • 設問の意味が、いまひとつ理解できず。
  • 処理時間への工夫が弱すぎる。

コメント

なんなりコメント下さい。