C/C++の宿題のまとめ@Wiki

整数を素数の和で表す

最終更新:

匿名ユーザー

- view
管理者のみ編集可
56 :デフォルトの名無しさん:2005/10/29(土) 04:07:33
[1] 授業単元: プログラミング
[2] 問題文:4以上500以下の整数で、その整数が2つの素数の和に分解できる整数を
      全て表示するプログラムを作成せよ。その際、分解した場合の2つの素数
      も表示すること。また複数の分解を持つ場合、2つの素数の差が最も小さい
      ものを表示すること。例えば10という整数を考えた場合
      10=3+7 , 10=5+5の2通りの分解があるが
      2つの素数の差が小さいのは10=5+5の方なので
      この場合は10=5+5と表示する。
[3] 環境
 [3.1] OS: WinXP
 [3.2] コンパイラ名とバージョン: lsic86NT.exe
 [3.3] 言語: C
[4] 期限: 2005年11月2日まで
[5] その他の制限: for文まで学習

よろしくおねがいします。

57 :デフォルトの名無しさん:2005/10/29(土) 05:08:11
>>56
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1024.txt

適当に作ってみました。ポインタの使用がまずいのであれば、
これらをすべて配列表現に直す必要があります。と言っても、
bsearch()の部分を線形探索に直すなどすればいいだけです。

58 :デフォルトの名無しさん:2005/10/29(土) 05:40:31
>>57
早朝からご苦労様です。ありがとうございます。
ポインタについてですがまだ習っていないのです。
C言語の授業2回目で出された課題で、1回目はコマンドプロンプトの起動方法
およびコンパイルの仕方等を学習しました。
配列表現や線形探索等初めて聞く用語で私には正直さっぱり……です。
授業2回目でハードルが急に上がったと思ってるのは私だけなのかな
これが普通なのでしたらごめんなさい。


59 :デフォルトの名無しさん:2005/10/29(土) 06:17:38
>>58
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1026.txt
57とは別人だが書いてみた。
素数を配列で与えるのがダメなら言ってくれ。

60 :デフォルトの名無しさん:2005/10/29(土) 06:27:25
>>59
ありがとうです。
問題文が言葉足らずでしたね、ごめんなさい
素数もプログラムによって求めないとだめと言われました。

61 :デフォルトの名無しさん:2005/10/29(土) 06:43:23
#include <stdio.h>
#include <math.h>
#define NMAX 501
void make_primelist(int*);
int main(void){
int prime[NMAX];
int i,n,x,y,fFind;
make_primelist(prime);
for(n=4 ; n<NMAX ;n++){
fFind=0;
//差が小さいのは真ん中付近なのでそこから調べる
for(x=n/2; x<n ; x++){
if(prime[x]){
y=n-x;
if(prime[y])
fFind=1;
break;
}}
if(fFind) printf("%d,%d,%d ",n,x,y);
}
return 0;
}

62 :デフォルトの名無しさん:2005/10/29(土) 06:44:09
//素数なら1違うなら0
void make_primelist(int* prime)
{
int i,j,t;
//初期化
for(i=0; i<NMAX ;i++) prime[i] = 1;
t = (int)sqrt(NMAX) + 1;
//エラストテネスのふるい
for(i=2; i<t ;i++){
//もしチェック済みなら次
if(prime[i]==0) continue;
for(j=2; i*j<NMAX ;j++){
prime[i*j]=0;
}
}
prime[0]=0;prime[1]=0;
return;
}


63 :デフォルトの名無しさん:2005/10/29(土) 06:44:53
int tbl[500], prime[500];
int i, j, n;
for (i = 0; i < 500; ++i)
 tbl[i] = 1;
for (i = 2; i < 500; ++i) {
 if (!tbl[i]) continue;
 for (j = i*i; j < 500; j += i)
  tbl[j] = 0;
}
for (i = 2, n = 0; i < 500; ++i)
 if (tbl[i]) prime[n++] = i;
}

64 :デフォルトの名無しさん:2005/10/29(土) 06:46:11
ケコーン

65 :デフォルトの名無しさん:2005/10/29(土) 06:48:27
>>61-62
わかりやすくつくってみたよ^^;

66 :デフォルトの名無しさん:2005/10/29(土) 07:12:25
>>58
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1027.txt
なんか早起きしたら初めてこのスレ見たので作ってみました
配列も習ってないっぽいので問題をそのままプログラムにしたけど、
2回目の授業でこれできたらこれから大変な気がする。

もっと効率上げられるけど、余計なことはしてません。

67 :デフォルトの名無しさん:2005/10/29(土) 07:16:05
>>66 7=3+4 ?

68 :66:2005/10/29(土) 07:20:05
あう。上(a)直して下(b)直してなかった...
// bは素数か調べる。調べ方はaと一緒
flag = 0;
for(i=2;i<= b/2;i++){
for文の判定に=入れてください
76 :59:2005/10/29(土) 14:55:09
>>60
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1028.txt
必要ないかもしれないが一応書いてみた。

77 :56:2005/10/29(土) 16:54:24
みなさん本当にありがとうございます。
とても分かりやすい解説まで付けてくれた方もいて
本当に助かりました。何度も修正してくれたりご苦労様です。
私の問題についてはこれで解決という形で終了させてください。
最後に本当にありがとうです。
目安箱バナー