blog/content/post/2008/05/06/2008-05-06-00000910.md

8.9 KiB
Raw Blame History

title author date url wordtwit_post_info categories
『新版 C言語によるアルゴリズムとデータ構造』のつづき kazu634 2008-05-06 /2008/05/06/_979/
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";}}
C
Programming

 続きだよ。

新版 C言語によるアルゴリズムとデータ構造

新版 C言語によるアルゴリズムとデータ構造

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までの、いずれの整数で割り算を行っても、割り切れなければ素数です。

Amazon CAPTCHA

という発想で書かれているそうなんだけれど、

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の型と値になります。

だそうです。