見出し画像

C言語を使ってみよう! - 動かしてみよう! - 素数

参考サイトを見ながら実際に動くプログラムを作ってみます。コマンドラインで入力していくものです。ターミナルの操作が必要になりますが、"Replit"を使うと右側にターミナルの画面が出ているのですぐに使うことができます。

素因数分解

#include <stdio.h>
#include <stdlib.h>

void  main( )
{
    char  c[128];
    int   n0,n;   // 整数
    int   ns=2;   // 素因数
    int   j;      // 乗数

    printf("\n★素因数分解★\n");
    printf("\n分解する整数: "); fflush(stdout);
    gets(c); n0=atoi(c);                    // 整数を入力

    for( n=n0; n>=ns; ns++ )
      {
        for( j=0; n%ns==0; j++ )            // 割り切れる間繰り返す
         {
           n/=ns;
         }

        if ( j==0 ) continue;               // 1回も割り切れなかった

        printf("素因数:%d  乗数:%d\n",ns,j);
     }
}

実行すると

素因数分解
分解する整数:

と出てくるので数字を入力します。例えば"9"と入力してreturnすると

分解する整数: 9
素因数:3 乗数:2

と素因数と条数が出てくるようになっています。


それでは中身を見てきましょう。

#include <stdlib.h>

追加しています。

fflush(stdout)

"fflush"でストリームの動作を制御。

・プログラムとファイルの間にはストリームと呼ばれるバッファがある
・プログラムからはファイルに直接出力せず、ストリームへデータを書き込
 む
・ストリームが満杯になった際などに、ストリームのデータが吐き出されて
 実際にファイルに書き込まれる(プログラム正常終了時などにも同様にス
 トリームからデータが吐き出される)

実際の動きとしては

fflush 関数を実行すると、指定したストリームのデータを即座に吐き出させることができます。つまり、fflush 関数を使用することで、データのファイルや画面への出タイミングを制御することが可能です。

値を受け取ったときの動作

gets(c);      ・・・ 入力受付 文字列で取得 "c"に入る
n0=atoi(c); ・・・"c"で受け取った文字列を数字へ変換して"n0"に代入

で入力された数字は文字列として認識されているので数字に変換します。

次に受け取った数字を"forループ"で

for( n=n0; n>=ns; ns++ )

繰り返して入力した数字を一つずつ取り出してさらに"forループ"で素数なので割れなくなるまで割ります。

取り出す最初の数字はこの場合"n0"からスタート。"ns"が"n"より大きくなるまで、"ns"を"1"づつ増やしていきます。

次のループで

for( j=0; n%ns==0; j++ ) 
  {
    n/=ns;
  }

"n%ns"を繰り返す命令です。この場合は"j"が"0"スタート"j"を1づつ増やし、 "n%ns==0"になるまで繰り返します。

そして割れなくなったら、 次の操作へ、

if ( j==0 ) continue;

"j"が"0"であれば"continue;" 次の動作をスキップします。そして

printf("素因数:%d 乗数:%d\n",ns, j);

で,"ns"が素数, "j"が条数(何回割ったか)の答えを出力します。

この記事が気に入ったらサポートをしてみませんか?