背景
1枚のファイルには、n個のポケットが横に並んでおり、表と裏の両面から名刺を眺めることができます。
このため、1つのポケットには、2枚の名刺が背中合わせに入っています。
- 1番からn番の名刺は、1枚目のファイルの表面から見たときに左詰めに並んでおり、
- n+1番から2n番の名刺は、1枚目のファイルの裏面から見たときに左詰めに並んでいます。
- 2枚目以降のファイルにも同様に名刺が並んでいます
このプログラムは、名刺を収納したバインダーにおいて、与えられた名刺番号 m
に対応する裏側の名刺番号を求めるものです。各ポケットには2枚の名刺が背中合わせに入っており、1枚のファイルには n
個のポケットが並んでいます。
全体のコード
以上のステップをまとめると、最終的なコードは以下のようになります。
# 入力を受け取る
n, m = map(int, input().split())
# 名刺番号を調整するために m-1 を計算
adjusted_m = m - 1
# adjusted_m を n で割った商に n を掛けた値を base とする
base = (adjusted_m // n) * n
# adjusted_m を n で割った余りを remainder とする
remainder = adjusted_m % n
# adjusted_m を 2*n で割った余りが n より小さい場合
if adjusted_m % (2 * n) < n:
# base に 2*n を足して、余りを引いた値を result とする
result = base + 2 * n - remainder
else:
# そうでない場合、base から余りを引いた値を result とする
result = base - remainder
# 名刺番号を出力
print(result)
例
たとえば、n = 3
、m = 5
の場合:
-
adjusted_m = 4
です。 -
base = 3
になります。 -
remainder = 1
です。 -
adjusted_m % (2 * n) = 4
なので、4 < 3
は偽です(つまり、名刺は裏側にあります)。 -
result = base - remainder = 3 - 1 = 2
となり、出力されるのは2
です。
ステップごとの詳細
このコードは、名刺の番号 m
が与えられたときに、その名刺がファイルのどちらの面にあるかを判断し、その裏側にある名刺の番号を計算して出力するものです。以下にコードの各部分を詳しく説明します。
コードの解説
1. 入力を受け取る
n, m = map(int, input().split())
まず、n と m の2つの整数値を標準入力から受け取ります。この際、input() 関数で入力を受け取り、split() でスペース区切りの値に分割し、map() 関数を使ってそれぞれを整数値に変換します。
-
n
: 1つのファイルに含まれるポケットの数を表します。 -
m
: 名刺の番号です。 -
input().split()
は、入力された文字列をスペースで区切り、それを整数に変換してn
とm
に代入します。
2. 名刺番号を調整する
adjusted_m = m - 1
- 名刺番号
m
を0ベースに変換するために、m-1
を計算してadjusted_m
に代入します。これにより、計算が簡単になります。
3. adjusted_m
を n
で割った商に n
を掛けた値を base
とする
base = (adjusted_m // n) * n
-
adjusted_m
をn
で割った商(整数部分)にn
を掛けた値をbase
として計算します。これは、名刺が属するファイルのブロックの開始番号に相当します。
4. adjusted_m
を n
で割った余りを remainder
とする
remainder = adjusted_m % n
-
adjusted_m
をn
で割った余りをremainder
として計算します。これは、名刺がそのブロック内で何番目に位置しているかを示します。
5. 条件による分岐
if adjusted_m % (2 * n) < n:
result = base + 2 * n - remainder
else:
result = base - remainder
-
adjusted_m % (2 * n) < n
: 名刺がファイルの表側にあるかどうかを判断します。- 表側にある場合 (
adjusted_m % (2 * n) < n
):-
result = base + 2 * n - remainder
:base
に2 * n
を足し、remainder
を引いた値をresult
とします。これにより、裏側の名刺番号を計算します。
-
- 裏側にある場合:
-
result = base - remainder
:base
からremainder
を引いた値をresult
とします。これにより、表側の名刺番号を計算します。
-
- 表側にある場合 (
6. 裏側の名刺番号を出力
print(result)
- 最後に、計算された
result
(裏側の名刺番号)を出力します。