素因数分解とは自然数を素数の掛け算で表すこと
素因数分解の対象は自然数であること(0を除く)
素数とは、1とその数以外に約数を持たないこと
### 素因数分解のやり方?
対象の自然数をNとする
1. Nを2で割る
-> 2で割り切れた場合: 割り切れた値を更に2で割る
-> 2で割り切れない場合: 下に行く
↓
2.3で割る(※2+1)
-> 3で割り切れた場合: 割り切れた値を更に3で割る
-> 3で割り切れない場合: 下に行く
↓
3.5で割る(※2+2)
-> 5で割り切れた場合: 割り切れた値を更に5で割る
-> 5で割り切れない場合: 7 下に行く
2から始めて、これをN回繰り返す であってる??
割る数は2から3へは+1だが、3以降は+2の方が無駄な計算がなくなる
プログラムで書きたい
#includeint main(void){ int prime = 27; // 素因数 int assemble[prime]; // 割り切れる数 int i, j, k; j = 0; for(i=2; i < prime; i++){ while(prime % i == 0){ prime = prime / i; assemble[j] = i; j++; } } for(k=0; k < j; k++){ printf("%d ", assemble[k]); } printf("\n"); return 0; }
素因数が27の時
$ ./main
3 3 3
上手くいってる。
素因数が21の時
$ ./main
3
あれ、何でだ。。
あ、forループでprimeが割られた数を代入するからおかしくなるんだ。
forループの変数を変えて再度計算します。
#includeint main(void){ int prime = 60; // 素因数 int cal = 60; int assemble[prime]; // 割り切れる数 int i, j, k; j = 0; for(i=2; i < cal; i++){ while(prime % i == 0){ prime = prime / i; assemble[j] = i; j++; } } for(k=0; k < j; k++){ printf("%d ", assemble[k]); } printf("\n"); return 0; }
素因数が60の時
$ ./main
2 2 3 5
素因数が115の時
$ ./main
5 23
わお、中々素晴らしい。
forループの時に、最初だけi++として、2回目以降をi+2とするにはどう書けばいいんだろう。
1回目の割り算を切り離して書いて、2回目以降をforループで書くのだろうか。