第9回【Python】各桁の和、カウント変数を使った計算、2 で何回割れる?、任意の数で何回割れる?
現在取り組んでいるのは、paiza ラーニング問題集「ループメニュー 2」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 9 回目です。
会社で部下と意見が合わず対立しているのに会議の時間が迫っている。まだ冷静になれていないのに、会議の内容なんて入ってこないですよ。そんなとき、意見を求められたら。まぁ、完璧な受け答えをしてしまうのが、LeoSaki(旦那)です。
それでは、今日も頑張ってみようと思います。
各桁の和
10 進数で表された整数 N が与えられます。
整数 N の各桁の和を計算し、出力してください。
パッと思いついたのが次の解答。
Python
N = input()
ans = 0
for i in range(len(N)):
ans += int(N[i])
print(ans)
間違えてはいないと思うのだけれど、数学的にはダメかもしれない。
Python
N = int(input())
ans = 0
while N > 0:
ans += N % 10
N //= 10
print(ans)
10 の剰余で 1 桁目を出して足し算。10 で割って 1 桁右にずらす。
うーん、こっちの方が計算量が多そうに見える。
VBA だとどうなるだろう。
セル A1 に N が入っています。
VBA
ans = 0
For i = 1 To Len(Cells(1, 1))
ans = ans + Mid(Cells(1, 1), i, 1)
Next
Debug.Print ans
cells(1,1) は変数に入れた方がスマートですね。Len 関数が int 型にも使えるので、これで良い気がします。
一応、数学的な解答を VBA で書いてみよう。
VBA
N = Cells(1, 1)
ans = 0
Do While N > 0
ans = ans + N Mod 10
N = Int(N / 10)
Loop
Debug.Print ans
カウント変数を使った計算
N 個の整数 M_1, M_2, …, M_N があります。
i 番目の M を M_i とするとき、M_i * i
を改行区切りで出力してください。
例えば、M_5
が 3
の場合、3 * 5 = 15
となります。
ちょっと分かりづらいけれども、i 番目の数 X と i を掛け合わせる。書いてみる。
Python
input()
A = list(map(int,input().split()))
for i,num in enumerate(A):
print((i+1)*num)
enumerate っていいなぁ。でも、N を利用していない。
Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
print((i+1)*A[i])
どれだけ需要があるのだろう。いや、ない。それでも VBA で書いてみる。
VBA
A = Split(Cells(2, 1), " ")
For i = 0 To UBound(A)
Debug.Print (i + 1) * A(i)
Next
2 で何回割れる?
整数 N が与えられます。
N が何回 2 で割れるかを求め、出力してください。
偶数の判定は前回の記事でやりました。
Python
N = int(input())
cnt = 0
while True:
if N % 2 == 0:
N //= 2
cnt += 1
else:
break
print(cnt)
これ以上やりようがない。たまに、N //=2 を忘れてタイムアウトするのはご愛敬って、やっちゃいけないよね。
VBA だったらどう書けばいいだろう。
VBA
N = Cells(1, 1)
cnt = 0
Do
If N Mod 2 = 0 Then
N = N / 2
cnt = cnt + 1
Else
Exit Do
End If
Loop
Debug.Print cnt
任意の数で何回割れる?
さっきの問題の割る数が任意の数に変わるだけ。
Python
N,M = map(int,input().split())
cnt = 0
while True:
if N % M == 0:
N //= M
cnt += 1
else:
break
print(cnt)
VBA でも同じかな?
VBA
N = Split(Cells(1, 1), " ")
cnt = 0
Do
If N(0) Mod N(1) = 0 Then
N(0) = N(0) / N(1)
cnt = cnt + 1
Else
Exit Do
End If
Loop
Debug.Print cnt
最後に
今は自分自身に基礎を叩きこんでいるときだと思って、面倒でも提示されたアイテムをすべて利用したコードを心掛けるべきだと思う。って偉そうなことを書いておいて、できていないからなぁ。「楽」できる関数があるのなら使ってしまう。
ひとつひとつ順番に取り組んでいくと、着実に力はついていくと思う。
こりゃ大変だ、とか思う瞬間はあるけれど、めんどくさがらずに、全部の問題をクリアしたい。
引き続き、お付き合いよろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません