階乗の末尾に 0 はいくつ付く?
#お題
整数 N が与えられます。
N の階乗 N!
の末尾に 0 がいくつ付くか求め、出力してください。
#入力
N
・ 1 行で整数 N が与えられます。
#出力
N の階乗 N!
の末尾に 0 がいくつ付くか求め、出力してください。
#コード
import math
n = int(input())
m = math.factorial(n)
a = []
while m > 0:
a.append(m % 10)
m //= 10
cnt = 0
while a[cnt] == 0:
cnt += 1
print(cnt)
#参考
- 整数 N を受け取ります。また、末尾の 0 の個数を保持する変数を宣言します。
- N! の末尾に 0 がいくつ付くのかという問題は、N! が 10 で何回割れるのか、つまり N! を素因数分解すると 2 * 5 がいくつ出てくるのかという問題と同じであると考えられます。
- また、N! を素因数分解したとき、2 より 5 の方が出てくる頻度は少ないので、5 が何個含まれるのかを数えればよいことになります。
- 例えば、
10!
を考えるとき、因数分解すると2^8 * 3^4 * 5^2 * 7
となり、5 は 2 個含まれていることが分かります。実際に10!
は3628800
なので、5 の個数と末尾の 0 の個数は一致していることがわかります。 - では、N! を求めずに末尾の 0 の個数を求める方法を考えると、N 以下の整数に 5 で割り切れる数がいくつあるか数えればいいと思うかもしれません。ですが、50 や 600 といった、5 を 2 つ以上持っている数もあるため、5 で割り切れる数の個数だけでなく、25(5^2)で割り切れる数の個数や、125(5^3)で割り切れる数の個数なども考える必要があります。
- N 以下の整数で 5 で割り切れる数の個数は
N / 5
で求めることができ、5^2 や 5^3 で割り切れる数の個数も同様にN / (5^2)
、N / (5^3)
で求めることができます。 - ループ処理を用いて、末尾の 0 の個数を保持する変数に
N / 5
を加算し、N を 5 で割ることを繰り返すことで、同じ動作が実現できます。 - 計算した値を出力します。
N = int(input())
count_zero = 0
while N > 0:
count_zero += N // 5
N //= 5
print(count_zero)
階乗の末尾に 0 はいくつ付く?
#お題
整数 N が与えられます。
N の階乗 N!
の末尾に 0 がいくつ付くか求め、出力してください。
#入力
N
・ 1 行で整数 N が与えられます。
#出力
N の階乗 N!
の末尾に 0 がいくつ付くか求め、出力してください。
#コード
import math
n = int(input())
m = math.factorial(n)
a = []
while m > 0:
a.append(m % 10)
m //= 10
cnt = 0
while a[cnt] == 0:
cnt += 1
print(cnt)
#参考
- 整数 N を受け取ります。また、末尾の 0 の個数を保持する変数を宣言します。
- N! の末尾に 0 がいくつ付くのかという問題は、N! が 10 で何回割れるのか、つまり N! を素因数分解すると 2 * 5 がいくつ出てくるのかという問題と同じであると考えられます。
- また、N! を素因数分解したとき、2 より 5 の方が出てくる頻度は少ないので、5 が何個含まれるのかを数えればよいことになります。
- 例えば、
10!
を考えるとき、因数分解すると2^8 * 3^4 * 5^2 * 7
となり、5 は 2 個含まれていることが分かります。実際に10!
は3628800
なので、5 の個数と末尾の 0 の個数は一致していることがわかります。 - では、N! を求めずに末尾の 0 の個数を求める方法を考えると、N 以下の整数に 5 で割り切れる数がいくつあるか数えればいいと思うかもしれません。ですが、50 や 600 といった、5 を 2 つ以上持っている数もあるため、5 で割り切れる数の個数だけでなく、25(5^2)で割り切れる数の個数や、125(5^3)で割り切れる数の個数なども考える必要があります。
- N 以下の整数で 5 で割り切れる数の個数は
N / 5
で求めることができ、5^2 や 5^3 で割り切れる数の個数も同様にN / (5^2)
、N / (5^3)
で求めることができます。 - ループ処理を用いて、末尾の 0 の個数を保持する変数に
N / 5
を加算し、N を 5 で割ることを繰り返すことで、同じ動作が実現できます。 - 計算した値を出力します。
N = int(input())
count_zero = 0
while N > 0:
count_zero += N // 5
N //= 5
print(count_zero)
階乗の計算
#お題
整数 N が与えられます。
N の階乗 N!
を計算して出力してください。
#入力
N
・ 1 行で整数 N が与えられます。
#出力
N の階乗 N!
を計算して出力してください。
#コード
n = int(input())
ans = n
while n -1 > 0:
ans = ans * (n - 1 )
n -= 1
print(ans)
↓(修正)
import math
n = int(input())
print(math.factorial(n))
#参考
- Python の場合、 math モジュールの factorial 関数を使用すると、階乗の計算を行うことができます。
from math import factorial
N = int(input())
print(factorial(N))
階乗の計算
#お題
整数 N が与えられます。
N の階乗 N!
を計算して出力してください。
#入力
N
・ 1 行で整数 N が与えられます。
#出力
N の階乗 N!
を計算して出力してください。
#コード
n = int(input())
ans = n
while n -1 > 0:
ans = ans * (n - 1 )
n -= 1
print(ans)
↓(修正)
import math
n = int(input())
print(math.factorial(n))
#参考
- Python の場合、 math モジュールの factorial 関数を使用すると、階乗の計算を行うことができます。
from math import factorial
N = int(input())
print(factorial(N))
毎日増加するお金
#お題
現在所持金を A 円持っています。
所持金が毎日 10% ずつ増えるとき、何日後に B 円を超えるか出力してください。
また、増加するお金は小数点以下切り捨てで考えることとします。
例として、所持金が 831 円
のとき、10% は 83.1円
ですが、増加するお金は 83 円
です。
#入力
A B
・ 1 行で整数 A B が与えられます。
#出力
所持金が毎日 10% ずつ増えるとき、何日後に B 円を超えるか出力してください。
#コード
a,b = map(int,input().split())
day = 0
while a <= b:
day += 1
a += int(a * 0.1)
print(day)
#参考
A, B = map(int, input().split())
num = 0
while A <= B:
A = int(A * 1.1)
num += 1
print(num)
- 条件を
A <= B
とすることで、A が B 以下の間繰り返すことができます。 - Python の場合、
int()
関数で丸めることで小数点以下を切り捨てることができます。
N が M ずつ増えたときにいつ K を越える?
#お題
整数 N, M, K が与えられます。
N が M ずつ増えるとき、何回目に K を越えるか出力してください。
#入力
N M K
・ 1 行で整数 N, M, K が与えられます。
#出力
N が M ずつ増えるとき、何回目に K を越えるか出力してください。
#コード
n,m,k = map(int,input().split())
cnt = 0
while n <= k:
cnt += 1
n += m
print(cnt)
#参考
N, M, K = map(int, input().split())
num = 0
while N <= K:
N += M
num += 1
print(num)
- 条件を
N <= K
とすることで、N が K 以下の間繰り返すことができます。 - 条件を間違えて
N < K
としてしまうと、N が K を越えずに、丁度 K になった場合でも繰り返すのをやめてしまうので注意してください。
10進数→N進数へ変換
#お題
10 進数で表された整数 N, M が与えられます。
N を M 進数に変換して出力してください。
#入力
N M
・ 1 行で整数 N, M が与えられます。
#出力
N M
・ 1 行で整数 N, M が与えられます。
#コード
a,b = map(int,input().split())
ans = ""
tmp = a
while tmp >= b:
ans = str(tmp % b) + ans
tmp //= b
ans = str(tmp % b) + ans
print(ans)
#参考
<別解>
N, M = map(int, input().split())
base = ""
while N > 0:
base += str(N % M)
N //= M
print(base[::-1])
- N が自然数であれば、M で割った余りを取ると、M 進数に変換した際の M^0 の桁を求めることができます。
- M^0 の位を求めたら N を M で割り、もう一度同じ操作を繰り返すと M^1 の位を求めることができます。
- これを繰り返していくことで N を M 進数に変換することができました。