巨大な数の足し算。
あれ、、、これじゃだめだっけ?と思ってたけど
OKだった
S = int(input())
T = int(input())
print(S + T)
え、これでいいのか?
と思ったが、意図は違ったらしい。
S , T を数値として扱うとオーバーフローが発生します。
答えとなる値も数値として扱うことはできない
なるほど。。。だから文字列でしないとだめなのか。
繰り上がりがないとすると、計算はたしかにこうなるよな。。。
でもそれなら、オーバーフローさせて正解にしないほうがいいんじゃないかな?
まあ、勉強ってことで。。
s = input()
t = input()
ans = ""
for i in range(len(s)):
ans += str(int(s[i]) + int(t[i]))
print(ans)
じゃあ繰り上がりがあるときはどうするのかな?
次の問題もやってみる。
おそらくこれは繰り上がりあり。
基本は前のを使うとして、繰り上がりをどうするか。
まず1桁から数えないといけないから前回と同じ方法は使えないのかしら。
逆から考えるってことやんな。
pythonの場合逆ループができるので。。。
繰り上がりはループのはじめにcとしてその桁のトータルを計算しておきます。
で、繰り上がりがなければ繰り上がりの変数を0にしておきます。
そのあと、判定としてループの最後に行っていて、かつ、繰り上がりがあれば
それを最後に付け足し、後はプリントと。
これでできました
s = input()
t = input()
c = 0
total = 0
ans = ""
for i in reversed(range(len(s))):
total = int(s[i]) + int(t[i]) + c
if total > 9:
tmp = str(total)
ans = (tmp[1]) + ans
c = int(tmp[0])
elif total <= 9:
ans = str(total) + ans
c = 0
if c > 0 and i == 0:
ans = str(c) + ans
total = 0
print(ans)
答えを見ると。。。
ループの書き方なるほどです。。。
これはpythonじゃないときにつかえるな。
繰り上がりの考え方ですが、10で割った商が繰り上がりの数、
余りが1桁の答えになりますね。
これを利用したアルゴリズムです。
スライスにするか計算にするか、で考え方が分かれそうです。
s = input()
t = input()
ans = ""
upper = 0
for i in range(len(s) - 1, -1, -1):
z = int(s[i]) + int(t[i]) + upper
upper = z // 10
ans = str(z % 10) + ans
if i == 0 and upper > 0:
ans = str(upper) + ans
print(ans)
つづいて掛け算にも挑戦。
これは前回と考え方は同じなので
ちょっと変えれば。。。
このケースの場合、すべての桁が0になったとき1桁の0に変えないといけないので
その判定も入れています。
でも実は、t=0だったら0をprintするだけでもよかった。むしろこっちのほうが簡単だな。。。。
0にどんな数をかけても0やし。
s = input()
t = input()
ans = ""
upper = 0
for i in range(len(s) - 1, -1, -1):
z = int(s[i]) * int(t) + upper
upper = z // 10
ans = str(z % 10) + ans
if i == 0 and upper > 0:
ans = str(upper) + ans
flag = False
for i in ans:
if i != "0":
flag = True
if flag == False:
ans ="0"
print(ans)