みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

   #include<stdio.h>

   #include<stdio.h>
#include<math.h>

int main(void)
{
int i,n,limit;
printf("data? ");
scanf("%d",&n);
i(n>=2){
limit=int)sqrt(n);
for(i=limit;i1;i--){
if(n%i==0)
break;
}
if(i==1)
printf("素数\n);
else
printf("素数でない\n");
}
return 0;
}

というプログラムがあるのですが、それを改良して int型(符号付32ビット整数)および、unsigned int型(符号なし32ビット整数)のそれぞれの最大の素数を求めよという問題があり、ただし、エラトステネスのふるいは使わずに、上のプログラムを改良してみよという問題がどっかにあったんですが、全然わからないので、教えてください。

投稿日時 - 2010-01-24 10:19:12

QNo.5618544

すぐに回答ほしいです

質問者が選んだベストアンサー

最初に。
このプログラム、ところどころ打ち間違いがあります。直しておきましょう。
i(n>=2){
limit=(int)sqrt(n);
for(i=limit;i>=1;i--){

まず、プログラムを、機能ごとに分けて考えます。

printf("data? ");
scanf("%d",&n);
が素数判定する数値nを決めるところ

if(n>=2){
から return 0 ; の前の
}
までがn が素数かの判定しているところ
です。

では、改造に入ります。
intの範囲での最大の素数、ということなので、 intの最大値 から順番に素数判定を行い、最初に見つかった素数が、求める値、となります。

元はnをキーボードから入力しています。
これをキーボード入力ではなく、プログラム中で「intの最大値 から順番に」するには、どうしたらいいと思いますか?

元の判定部は
if(i==1)
printf("素数\n);
else
printf("素数でない\n");
です。これは n に対して「素数/素数でない」と表示されます。
改造するときに
・「素数でない」という表示は必要でしょうか?
・「素数」という表示ではnはわかりません。 nも表示するにはどうしたらいいと思いますか?
・素数が見つかったら、ループを抜けないと、int型の全ての素数を表示するプログラムになってしまいます。ループを抜けるにはどうしたらよいでしょうか?

以上の考えかたで、改造できると思いますが、いかがでしょうか。

unsigned int版へは次の2点を変更します。
・計算に使う変数はunsigned intにする必要がある。
・nはunsigned intの最大値から順番に

投稿日時 - 2010-01-24 11:05:52

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

このプログラムは入力された数値が素数か素数でないかを判定するプログラムです。
(ifがiになっていたりカッコが足りなかったりダブルクォーテーションが足りなかったりしていますが、おそらくコピペミス?)

ということは、

1.このmain関数をsub関数にして
2.scanfで読み込む箇所は引数で渡してもらって
3.素数なら1そうでなければ0を返すようにして
4.main関数でsub関数を数分呼び出し
5.subから1が戻ってくる毎に値を更新していけば
求めるプログラムとなります。

投稿日時 - 2010-01-24 10:54:11

補足

すみません。私はC言語の知識が薄くあなた様が述べたやり方を言われても分からないので、プログラムで表すとこうなるみたいなのを教えてください。

投稿日時 - 2010-01-24 10:59:25

ANo.1

値の入力で scanf 関数で行っているとこを for ループにして
(全体の処理を for ループで回して)
一番最初に素数が見つかったら終了すればいいだけなのでは?
ループが最大値から0になるようにループさせればいいだけだと思いますが

わざわざこちらがコード提示しないと上に書いたことすら分からない
ってレベルですか?

投稿日時 - 2010-01-24 10:43:56

お礼

私はまだこのようなレベルのプログラミングまで覚えきれてないのでわかりません。

投稿日時 - 2010-01-24 11:02:54