恐怖の月曜日 2007-11-26 Vol.3

もはやここまでくると関係ないんですが、一応恐怖の月曜日シリーズ。
K講師配布資料の問題に、入力された自然数が素数かどうかを判定するというものがあります。

(032) キーボードから入力された整数 n (n>1)が素数かどうか判断するプログラムを作れ。ただし、n > 1 でない時には終了するものとする。
素数でない時にはその最小約数を表示するものとする。(1234567 は素数か?)
(ヒント) k=2 から始めて n%k が 0 となるまで、k を増やしていく。

素数じゃないときは最小約数を表示するのはいいとして、素数のときはどうしたらいいの?
「素数です」とでも表示すればいいのかなと。
とりあえず、問題で確定しているのは

  1. 整数型 n と k を定義(宣言といったほうが馴染み深い?)
  2. n > 1 でないときはプログラムを終了する
  3. 反復文を書くときは k = 2 から始める
  4. n % k = 0 となるときに何かをさせる

ということでしょうか。

さらにここで確認しておくこと。
この問題が出題される時点では

  1. break 文
  2. return 文
  3. exit 文
  4. continue 文
  5. goto 文
  6. switch 文

は説明している(はず)なので使えるようになっているはず…
とまぁ、実際そんなに上手いこといかないんですよ、これが。
K講師ってばサラッとここの部分を流しちゃったので多分理解している人が少ない…orz
まぁ、できるという前提で全然キレイなコードではないんですが、一応例を挙げておきます。

/******************************************************************************
 * prime.c : 素数判定
 ******************************************************************************
 * (032)
 * キーボードから入力された整数 n (n>1)が素数かどうか判断するプログラムを作れ。
 * ただし、n > 1 でない時には終了するものとする。素数でない時にはその最小約数を
 * 表示するものとする。(1234567 は素数か?)
 * (ヒント) k=2 から始めて n%k が 0 となるまで、k を増やしていく。
 *****************************************************************************/

#include "vcns.h"        /* scanf()警告抑制 */
#include <stdio.h>       /* printf(), gets() */
#include <stdlib.h>      /* atoi() */

int main( void )
{
	int n, k;
	char cn[11];
	
	/* 入力フェーズ : gets( cn ); は scanf( "%s", cn ); でもOK。*/
	printf( "1より大きい自然数を入力 : " );
	gets( cn );          
	n = atoi( cn );
	
	/* 1以下の数が入力されたら終了 */
	if( n < 2 )
	{
		printf( "無効な数値が入力されました。\n" );
		return 0;
	}
	
	/* k = 2 から k = n となるまで k の値を 1 ずつ増やす。
	 * もし n と k の剰余が 0 になったときに k = n だった場合は素数と判定、
	 * そうでなかった場合は最小約数を表示する。
	 */
	for( k = 2; k <= n; ++k )
	{
		if( n % k == 0 )
		{
			printf( "%d", k );
			if( n == k )
			{
				printf( "は素数です。\n" );
			}
			else
			{
				printf( "が%dの最小約数です。\n", n );
			}
			break;
		}
	}
	
	return 0;
}

まぁ授業で説明していたであろう範囲で書けばこれが無難なところなんじゃないかと。
と思いきや書いてから気づいたわけですが、atoi() とか gets() なんて教えてたっけ・・・orz
まぁ授業に沿った形に直すのであれば #include<stdlib.h> と char cn[11]; と n = atoi( cn ); を外して、gets( cn ); の部分を scanf( "%d", &n ); と置き換えればいいわけですけど。

で、この問題は 1234567 が素数かどうかを調べるということも入っていますので、実行してみますと

1より大きい自然数を入力 : 1234567
127が1234567の最小約数です。

となって、1234567は素数ではなく、最小約数が127の数であるということがわかるわけです。
ちなみに他の数を入力しますと次のような実行結果になります。

1より大きい自然数を入力 : 1
無効な数値が入力されました。
------------------------------
1より大きい自然数を入力 : 2
2は素数です。
------------------------------
1より大きい自然数を入力 : 4
2が4の最小約数です。
------------------------------
1より大きい自然数を入力 : 11
11は素数です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中