高校数学10分プログラミング(数学Ⅱ編 4.指数関数と対数関数)5日目「常用対数で数の桁数を計算する」
マガジンリスト > 数学Ⅱ編 4.指数関数と対数関数 > 5日目 課題
おはようございます。
本日は、高校数学10分プログラミング(数学II編 4.指数関数と対数関数)の5日目です。
本日の課題は、常用対数を用いて数の桁数を計算するプログラムを作成することです。
常用対数
$${10}$$を底とする対数を常用対数という。
$${x = a \times 10^n}$$($${n}$$は整数、$${1 \leq a <10}$$)とすると、$${ \log_{10} x = n + \log_{10} a }$$
桁数と対数
① $${N \geq 1}$$
$${N}$$の整数部分が$${n}$$桁
$${ \Leftrightarrow }$$ $${10^{n-1} \leq N < 10^n}$$
$${ \Leftrightarrow }$$ $${\log_{10} N}$$の整数部分が$${n-1}$$
② $${0 < N <1}$$
$${N}$$は小数第$${n}$$位に初めて$${0}$$でない数字が現れる
$${ \Leftrightarrow }$$ $${ 10^{-n} \leq N < 10^{-n+1} }$$
$${ \Leftrightarrow }$$ $${\log_{10} N}$$の整数部分が$${-n}$$
課題
次の(1)~(3)の値は何桁の数か、また、(4),(5)の値は小数第何位に初めて$${0}$$でない数字が現れるかを算出するプログラムを作成してください。
(1) $${ 2^{50} }$$
(2) $${ 6^{40} }$$
(3) $${ \sqrt[3]{ 12^{100} } }$$
(4) $${ \left( \frac{1}{2} \right)^{100} }$$
(5) $${ \sqrt[3]{ (0.06)^{10} } }$$
ヒント
アルゴリズム設計
常用対数を計算するためには、前々回の課題『高校数学10分プログラミング(数学Ⅱ編 4.指数関数と対数関数)3日目「対数の値を計算する」』で作成した logarithm 関数を利用することができます。
// 底aを持つ対数を計算する関数
float logarithm(
float a, // 底
float x // 真数
){
return log(x)/log(a);
}
a:底 float型
x:真数 float型
返り値:$${\log_a x}$$の値 float型
ただし、今回は常用対数ですので、底は$${a=10}$$として利用します。
また、この常用対数を利用して、$${N\geq 1}$$の場合は$${N}$$の桁数、$${0 < N <1}$$の場合は小数第何位に初めて$${0}$$でない数字が現れるかを算出する関数 calc_digits を準備して、この calc_digits 関数をsetup 関数内で呼び出すことで計算することにします(ソースコード1)。
// 常用対数を計算して桁数を求める
void setup(){
// (1)
int a01 = calc_digits();
println("(1):", a01,"桁");
// (2)
int a02 = calc_digits();
println("(2):", a02,"桁");
// (3)
int a03 = calc_digits();
println("(3):", a03,"桁");
// (4)
int a04 = calc_digits();
println("(4):", "小数第",a04,"位");
// (5)
int a05 = calc_digits();
println("(5):","小数第",a05,"位");
}
// 底aを持つ対数を計算する関数
float logarithm(
float a, // 底
float x // 真数
){
return log(x)/log(a);
}
// a^nの桁数を求める関数
int calc_digits(
float a, // 底
float n // 冪指数
){
}
ソースコード1 数の桁数を計算するプログラム(未完成)
なお、calc_digits 関数は、$${N=a^n}$$という形にして、引数を底$${a}$$と冪指数$${n}$$とを引数に取り、返り値は桁数を整数(int型)で返すようにします。
ソースコード1は未完成です。calc_digits 関数の中身を上記の桁数と対数で説明したことを参考にして追記し、setup 関数内で呼び出している calc_digits 関数の引数を課題に合わせて設定することでプログラムを完成させてください。
なお、必要であれば、小数の小数部分を切り捨てて整数部分のみを残す関数 floor を利用してください。
floor(n);
n:小数 float型
返り値:整数部分 int型
それでは、よろしくお願いします。
MK's papa