身につくC言語21回目 素因数分解のプログラム

今回は素因数分解のプログラムの紹介です。

まずはこの問題をやってみてください。

問題 任意の自然数を取得して、素因数分解をして結果を出力しなさい

例)入力値:6

実行結果

2 3

例)入力値:12

実行結果

2 2 3


素因数分解がわからない!という人はこちらを見てみてください。
3分でわかる!素因数分解とはなんだろう??
とても分かりやすく解説されています。

やり方がわかったら、一度自分で解いてみるのもいいかもしれませんね。

解答

ではさっそく答えを表示します。


#include<stdio.h>
int main(void)
{
	int num;
	int i;
	
	printf("自然数を入力してください。\n");
	scanf("%d",&num);
	if(num<0)
	{
		printf("自然数を入力してください。\n");
		return 1;
	}
	
	printf("素因数分解をします。\n");
	
	if(num==1)
	{
		printf("%d\n",num);
	}
	else
	{
		for(i=2;i<=num;i++)
		{
			if(num%i==0)
			{
				printf("%d ",i);
				num=num/i;
				i=1;
			}
		}
	}
	return 0;
}

解説をしていきます。


#include<stdio.h>
int main(void)
{
	int num;
	int i;
	
	printf("自然数を入力してください。\n");
	scanf("%d",&num);
	if(num<0)
	{
		printf("自然数を入力してください。\n");
		return 1;
	}
	
	printf("素因数分解をします。\n");

ここでは、整数を入力させています。

if文で0未満が入力された場合には、return1で異常終了しています。

本当は、1.1というような少数を入力された場合の処理も考えたほうがいいのですが、ここでは考えないことにします。


	if(num==1)
	{
		printf("%d\n",num);
	}
	else
	{
		for(i=2;i<=num;i++)
		{
			if(num%i==0)
			{
				printf("%d ",i);
				num=num/i;
				i=1;
			}
		}
	}
	return 0;
}

まず最初に入力された自然数が1の場合は、素因数分解すると1なのでprintfでそのまま1を出力しています。

重要なのは1以外の場合です。


	else
	{
		for(i=2;i<=num;i++)
		{
			if(num%i==0)
			{
				printf("%d ",i);
				num=num/i;
				i=1;
			}
		}
	}

for文の中を日本語で表すと
iに2を代入します。iがnumになったら終了します。iは1ずつ増えます。
という意味です。

for文の1回目のnumには入力された自然数が入っています。

 

1回目のif文は
入力された値を2で割った余りが0であれば、2を出力し、numに入力された値を2で割った数を代入し、iを1にしなさい。
という意味です。

例えば4が入力されたら、1回目のfor文では、2が出力され、numには2が代入されます。

 

次に2回目のfor文の説明です。
4を入力したという例を使いましょう。

numの値は2で、iは1増えるので2になります。

numをiで割った余りは0なので、printfで2が出力され、numには1が代入され、iが1になります。

 

さらに3回目のfor文を見てみましょう。

numの値は1で、iは1増えるので2です。

if文は1を2で割ることはできないので、飛ばされます。

ということはここでプログラムが終了します。

まとめ

今回は入力した自然数が4という場合で考えてみましたが、6の場合、12の場合など自分で考えてみるとより理解が深まります。

 

素因数分解をやったところで何が得なんだって話ですけれどね。