ページ 11

書籍やさしいCで納得行かない部分がありまして・・・

Posted: 2016年2月09日(火) 04:56
by かちくんくん
今現在 やさしいCという書籍でC言語を勉強しているものです。


練習問題の一つに
 
 キーボードから数を入力し、その数が素数
 (1またはその数以外で割り切れない数)であるかどうかを
 判断するコードを記述してください。

という問題で
実行した際の画面結果の具体例はこちらで

 ・7を入力した際の画面結果
  2以上の整数を入力してください。
  7
 7は素数です。
 ・10を入力した際の画面結果
  2以上の整数を入力してください。
  10
 10は素数ではありません。


そして
このコードの答えがこちらでした。

コード:

 
#include <stdio.h>

int main(void)
{
  int num,i;

 printf("2以上の整数を入力してください。\n");
 scanf("%d", &num);

for(i=2; i<=num; i++){
    if(i == num){
     printf("%dは素数です。\n", num);
    }
   else if((num%i)==0){
     printf("%dは素数ではありません。\n", num);
     break;
    }

}



お聞きしたい点は
numに7をいれても10をいれたとしても
繰り返すたびにiの数は増えて最終的には
if(i == num)の条件には合うと思うのですが
なぜ10を入れた際にelse if((num%i)==0)の条件分岐になるのでしょうか??
またどういう処理をしているのかが気になっています
もやもやして寝るに寝れなくて困っています。宜しくお願いします!

Re: 書籍やさしいCで納得行かない部分がありまして・・・

Posted: 2016年2月09日(火) 06:32
by yuni
まずご存知かもしれませんが、予備知識として。
・素数は1かその数でしか割れない値、です。
・ % 演算は、割った余りを求めます。
・割った余りが0のときは割り切れている状態なので、素数ではありません。

つまり、7のときは2で割った余りは1、3で割った余りは1、…となり、 num == i つまり 7 == 7になるので素数です。
10の場合は2で割ったら余りが0なので、num%i==0 つまり素数ではない、ということですね。

Re: 書籍やさしいCで納得行かない部分がありまして・・・

Posted: 2016年2月09日(火) 07:18
by box
自分がコンピュータになったつもりで
コードを1行ずつ追いかけてみると
解決へのきざしが見えてくるかもしれません。

Re: 書籍やさしいCで納得行かない部分がありまして・・・

Posted: 2016年2月09日(火) 08:32
by non
17行目のbreakは、forループから抜け出すという意味です。非素数の場合は最後(i==num)まで行きません。

Re: 書籍やさしいCで納得行かない部分がありまして・・・

Posted: 2016年2月09日(火) 13:33
by かちくんくん
皆さんの解説でやっと納得できました。

10を入力した際は1回目の繰り返しの時点で
はelse ifの条件に合い、分岐するのでforループから抜け出せてますね・・・

皆さんの解説を読むまで気が付かなかった自分が恥ずかしいです。
私が考えすぎて頭がおかしくなっていたかもしれません。

教えてくださりありがとうございました。