はじめまして。sqrt27です。「ルートさん」や「ルートくん」などと呼んで頂いて構いません。本名を知っている方に関してはここでの本名呼びを禁止しますのでよろしくお願いします。まずは私のいちステータスであるC言語プログラミングのことを書こうと思い、この題で書くことを決めました。
ということで早速ですが、プログラムのソースコードをご覧下さい。ちなみにおおまかな解説はプログラム内コメントに書いています。
なおプログラムは私自身の解釈によるものであり、課題等に役立つものとは限りませんのでご了承ください。
#include<stdio.h> //標準入出力に必要
#include<math.h> //平方根を使用するので欠かせない
int main(void)
{
unsigned long long int num=2,division;
//num: 素因数分解対象(処理の都合上2に初期化する)
//division:割る数
printf("これは、素因数分解の演算を行うプログラムです.\nプログラムを停止するには,1以下の数を入力して下さい.\n");
while(num>1){
printf("\n入力:");
scanf("%llu",&num); //入力モード
printf("出力:%llu=",num); //素因数分解対象をまず表示
division=2; //割る数を最小の素数に設定する
//割る数が対象数の平方根を上回るまで繰り返す
while(division<=(unsigned long long int)(sqrt((double)num))){
if(num%division==0){ //割り切れるならば
printf("%llu*",division); //表示して
num=num/division; //割る演算を行う
}else{ //割り切れないならば以下の処理を行う
if(division==2){
division++; //2なら3にする
}else{
division=division+2; //3以上なら2足す
}
}
}printf("%llu\n",num); //残った数を最後に表示
}
return 0; //正常終了をシステムに返す
}
いかがでしょうか。ところで見慣れない型名がありますね。それについて補足します。
unsigned long long int型というのは、int型(整数型)であると同時にlong(範囲が長い、すなわち最大値が従来のint型より大きい)であるという意味で、unsignedは符号なしという意味で、最大値がさらに2倍されます。ただしint型の最大値はシステムにより異なりますので、開発環境をご確認下さい。
ちなみになぜ1以下で終了するようにしているかというと、0と1は素数でも合成数でもない特殊な数だからです。
なお割る数が奇数の合成数のときは必ずnum%divisionの値がelseの方にいくので素数判定は不要です。
2乗以上などもそのまま表示(3^2 → 3*3 や 2^3 → 2*2*2 など)します。
ということで実行結果の一例を提示します。
ひとつ注意しておくことがあるとすればUbuntuのgccでコンパイルするときはコマンドをひと通り書き終えた後に「-lm」を付加することくらいですね。LibraryのLとMathematicsのMです。これがないとUbuntuではエラーになりますのでご注意ください。
いかがでしたか。今回はこの辺で終わりにしておきます。
今後ともsqrt27をよろしくお願いします。
訂正(2021-08-27確認分)
誤: 割る数が対象数の平方根を下回るまで繰り返す
正: 割る数が対象数の平方根を上回るまで繰り返す
これをもって訂正とします。なお本文内のものは訂正済のものです。