余りの計算(黒板)

問題

黒板に0という整数が書かれています。

その整数に対して $ N $ 回の操作を行います。

$ i $回目の操作は文字$ T_i $と整数$ A_i $で表され、その操作内容は次の3種類です。

🔹$ T_i = + $ のとき:$ A_i $ を足す。
🔹$ T_i = - $ のとき:$ A_i $ を引く。
🔹$ T_i = * $ のとき:$ A_i $ を掛ける。

各操作が終わった後について、黒板に書かれた整数を10000で割った余りを出力するプログラムを作成して下さい。

[制約]
🔹$ 1 \leqq n \leqq 100000 $
🔹$ 1 \leqq A_i \leqq 100 $
🔹黒板に書かれる整数は常に0以上

解き方・ソースコード

この問題はオーバーフローを防ぐために操作が行われるたびに余りをとるということがポイントとなります。

ただし引き算を行う場合、計算結果がマイナスになってしまう可能性がるため、計算の途中で0を下回った場合10000を足す必要があります。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#--------- 入力例1 ----------
N = 4
A = ['+ 59',
'+ 41',
'* 100',
'- 1']
#----------------------------
# 現在の黒板の数
Answer = 0
for a in A:
ss = a.split()
if ss[0] == '+':
Answer += int(ss[1])
elif ss[0] == '-':
Answer -= int(ss[1])
elif ss[0] == '*':
Answer *= int(ss[1])

# 引き算で答えが 0 未満になった場合
if Answer < 0:
Answer += 10000

# 余りをとる
Answer %= 10000
print(Answer)

[実行結果(入力例1)]

59
100
0
9999

解が非常に大きくなる問題では、余りを出力するということがよくあるので上記の手法を覚えておくことはとても有益です。