--- title: 『新版 C言語によるアルゴリズムとデータ構造』のつづき author: kazu634 date: 2008-05-06 url: /2008/05/06/_979/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3985;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - C - Programming ---
続きだよ。
例題としてあげられているプログラムの読み方でちょっととまどった。
#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を満たしているかを確認する命令でしたね。失礼しました(__)
さっきのを
みたいな発想で
#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の型と値になります。
だそうです。