■H25春
問7 配列Aに対して次の手続を実行して,2≦k≦100である素数kだけを全て出力したい。a,b,cに入るループの初期値,終値,増分として,適切な組合せはどれか。
for k = 2 to 100 step 1:
A[k] = 1;
for m = 2 to 10 step 1:
for k =[ a ] to [ b ] step [ c ]:
A[k] = 0;
for k = 2 to 100 step 1:
if A[k]≠0:
print k;

【正解】イ
実際のプログラムの例は以下
【処理の解説】
・エラトステネスのふるい法を使って素数を求めています。
・変数Aは、0か1の値になるが、A[k]=0なら非素数、A[k]=1なら素数(処理の途中では「素数の可能性」)
・まず2から100をすべて素数かもしれないリストに入れる
(k=2-100についてA[k] = 1)
・素数とは「約数として自分と1だけもつ」ことから、「何かの倍数であれば素数ではない」という考えで、倍数をすべて消していく。具体的にはA[k] = 0
問7 配列Aに対して次の手続を実行して,2≦k≦100である素数kだけを全て出力したい。a,b,cに入るループの初期値,終値,増分として,適切な組合せはどれか。
for k = 2 to 100 step 1:
A[k] = 1;
for m = 2 to 10 step 1:
for k =[ a ] to [ b ] step [ c ]:
A[k] = 0;
for k = 2 to 100 step 1:
if A[k]≠0:
print k;

【正解】イ
実際のプログラムの例は以下
#include<stdio.h> // stdio.h(標準入出力を行うための関数が定義されたファイル)を読み込む // main関数。引数は取らない。処理後に値を返さない void main() { int A[101]; // 配列変数Aを定義。保存可能個数は101個でA[0]-A[100]を使用可能。 int k, m; // 整数型の変数kとmを定義 // kを2から100まで、1ずつ増やす(k++) for (k = 2; k <= 100; k++) { A[k] = 1; // A[2]-A[100]をすべて1にしている } // 2の倍数-10の倍数をリストから消していく for (m = 2; m <= 10; m++) { // mを2から10まで1ずつ増やす for (k = 2*m; k <= 100; k += m) { // kを2mから100までmずつ増やす // つまりkは2m, 3m, 4m,・・・と変化 A[k] = 0; // kはmの倍数=素数ではないから0にする } } for (k = 2; k <= 100; k++) { // kを2から100まで1ずつ増やす if (A[k] != 0) { // A[k]が0でない、つまりkが素数なら printf("%d,", k); // kを表示 } } } |
・エラトステネスのふるい法を使って素数を求めています。
・変数Aは、0か1の値になるが、A[k]=0なら非素数、A[k]=1なら素数(処理の途中では「素数の可能性」)
・まず2から100をすべて素数かもしれないリストに入れる
(k=2-100についてA[k] = 1)
・素数とは「約数として自分と1だけもつ」ことから、「何かの倍数であれば素数ではない」という考えで、倍数をすべて消していく。具体的にはA[k] = 0
コメント