高校数学10分プログラミング(40日目、2024年7月26日)解説
本日の課題、おつかれさまでした。
整数$${N}$$を素因数分解する関数 primefactorization を作成することができたでしょうか。
解答例
整数$${N}$$を素因数分解する関数 primefactorization 及びその関数を利用して$${N=60}$$を素因数分解して、結果の素数をコンソールに出力するプログラムの例は以下のようになります。
// 整数Nを素因数分解する
void setup(){
// 整数N(ただし、Nは2以上)
int N;
N = 60;
// 整数N以下の素数を求める
ArrayList<Integer> prime_numbers = getPrimeFactors(N);
// 素因数分解したときの各冪に対する指数を求める
ArrayList<Integer> exponents = primefactorization(N, prime_numbers);
// 素因数分解の結果をコンソールに出力する
int pn, exponent;
for(int i=0; i<prime_numbers.size(); i++){
pn = prime_numbers.get(i);
exponent = exponents.get(i);
for(int j=0; j<exponent; j++){
println(pn);
}
}
}
// 整数N以下の素数を求める関数
ArrayList<Integer> getPrimeFactors(
int N // 2以上の整数
){
// int型の可変配列を準備する
ArrayList<Integer> prime_numbers = new ArrayList<Integer>();
// 最初の素数2を可変配列に追加
prime_numbers.add(2);
boolean pn_flag; // 素数かどうかのフラグ
// 3以上N以下の整数について素数であるかを確認する
for(int n=3; n<=N; n++){
pn_flag = true;
for(int m=2; m<n; m++){
if( n%m == 0 ){ // mで割り切れたらnは素数でない
pn_flag = false;
}
}
if(pn_flag){
prime_numbers.add(n); // iが素数と判定された場合、可変配列に追加
}
}
return prime_numbers;
}
// 素因数分解を行う関数
ArrayList<Integer> primefactorization(
int N, // 2以上の整数
ArrayList<Integer> prime_numbers // N以下の素数
){
// 素因数分解したときの各冪に対する指数
ArrayList<Integer> exponents = new ArrayList<Integer>();
// 整数Nを素因数分解する
boolean divisible_flag; // 割り切れたかどうかを判定するフラグ
int quotient = N; // 素数で割ったときの商
int pn; // 素数を代入する変数
int exponent_count;
for(int i=0; i<prime_numbers.size(); i++){
pn = prime_numbers.get(i); // i番目の素数を取り出す
divisible_flag = true;
exponent_count = 0;
while(divisible_flag){
if( quotient % pn == 0 ){ // 商が素数pnで割り切れた場合
exponent_count++; // pnに対する指数の値を1増やす
quotient = quotient / pn; // 商を更新する
} else { // 素数pnがNの素因数ではない、またはpnがNの素因数としてすべて算出された場合
divisible_flag = false;
}
}
exponents.add(exponent_count);
}
return exponents;
}
ソースコード2 関数を利用して素因数分解して、結果の素数をコンソールに出力するプログラム(完成版)
Processing の開発環境ウィンドウを立ち上げて、そのテキストエディタ部分にソースコード2を書き写し、実行ボタン(左上の ▶ ボタン)を押すと、コンソールに、
2
2
3
5
と出力されます(図1)。
コンソールに出力された結果は、昨日作成した$${N=60}$$を素因数分解して、結果の素数をコンソールに出力するプログラムの出力結果と同じであることを確認しておいてください。
やってほしいこと
今回のプログラム(ソースコード2)と昨日作成した$${N=60}$$を素因数分解して、結果の素数をコンソールに出力するプログラムとを見比べて、関数化したときにどのような変更を加えているかを改めて確かめておいてください。
今週は以上です。
来週は整数$${M}$$と$${N}$$との最大公約数や最小公倍数をもとめるプログラムなどについて考えていきたいと思います。
来週もよろしくお願いします。
※今回の課題とその解答例について質問や疑問がある方は、本記事の下部にあるコメント欄からお願いします。
MK’s papa