8.9 KiB
8.9 KiB
title | author | date | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|
『新版 C言語によるアルゴリズムとデータ構造』のつづき | kazu634 | 2008-05-06 |
|
|
続きだよ。
- 作者: 柴田望洋,辻亮介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/08/27
- メディア: 大型本
- 購入: 4人 クリック: 14回
- この商品を含むブログ (23件) を見る
for の挙動
例題としてあげられているプログラムの読み方でちょっととまどった。
#include <stdio.h> int main(void); int main(void) { int i, n; unsigned long counter = ; for (n = 2;n <= 1000;n++) { for (i = 2;i < n;i++) { counter++; if ( == n % i) break; } if (n == i) printf ("%d\n", n); } printf ("除算を行った回数: %lu\n", counter); return(); }
これは
ある整数nは、2からn-1までの、いずれの整数で割り算を行っても、割り切れなければ素数です。
という発想で書かれているそうなんだけれど、
for (n = 2;n <= 1000;n++) { for (i = 2;i < n;i++) { counter++; if ( == n % i) break; } if (n == i) printf ("%d\n", n); }
の部分の内側のforがbreakせずに終了するときにはi++するからn=iになっていると言われて、なるへそと思ってしまった。そういえばforって、i++して条件式i < nを満たしているかを確認する命令でしたね。失礼しました(__)
配列の添え字指定をするときのインクリメントの挙動がわからない!
さっきのを
- 偶数は2で割り切れるんだから、考えるだけ無駄!
- 素数になるのは結局それ以前に素数だと判明した数字で割り切れなければいいんでしょ!
みたいな発想で
#include <stdio.h> int main(void); int main(void) { int i, n; int prime[500]; int ptr = ; unsigned long counter = ; prime[ptr++] = 2; prime[ptr++] = 3; for (n = 5;n <= 1000;n +=2) { for (i = 1;i < ptr;i++) { counter++; if ( == n % prime[i]) break; } if (ptr == i) prime[ptr++] = n; } for (i = ;i < ptr;i++) printf ("%d\n", prime[i]); printf ("除算を行った回数: %lu\n", counter); return(); }
これなんだけど、最初の「prime[ptr++] = 2;」の挙動が分からない(..;)どうやら
int ptr = ; prime[ptr] = 2; ptr++; prime[ptr] = 3; ptr++;
しているような雰囲気なんだけど、それで果たして良いのか?が疑問。
コンマ演算子
コンマ演算子を用いたコンマ式「operation1, operation2」を評価すると、式operation1とopeation2が順に評価され、この式全体としては後で評価されたoperation2の型と値になります。
だそうです。