![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
1000以下の素数を求めるプログラムについての問題について考えているのですが、何故2の数のとき、乗除を行う回数が加算されないのかが分かりません。また、3のとき乗除を1回しか行わないのか分かりません。理論的に2が素数となるのは定義付けられているから必要ないのか、とも思ったのですがそれならcounter++で2が範囲にあるのに加算されないという理由がよくわかりません。
初歩的な問題ですみませんが回答頂けると有難いです。
プログラムは下記の通りです。
#include <stdio.h>
int main(void)
{
int i,no;
unsigned long counter = 0;
for (no = 2; no <= 1000; no++) {
for (i = 2; i < no; i++) {
counter++;
if (no % i == 0)
break;
}
if (no == i)
printf("%d\n" , no);
}
printf("乗除を行った回数:%lu\n" , counter);
return (0);
}
No.1ベストアンサー
- 回答日時:
noが2のとき、
>for (i = 2; i < no; i++) {
このfor文は
for (i = 2; i < 2; i++) {
と同じですね。そうすると、i < 2 の条件を初回から満たしませんので、
このfor文の中身(counter++; など)をスキップします。
counterの値は不変です。
次に、noが3のとき、
>for (i = 2; i < no; i++) {
このfor文は
for (i = 2; i < 3; i++) {
と同じですね。そうすると、
iは2なので、i < 3 の条件を満たします。counter++; を実行します。
iをインクリメントし、3になります。そうすると、
i < 3 の条件を満たしませんので、for文のループを抜けます。
counterをインクリメントしたのは一度だけです。
No.5
- 回答日時:
#include <stdio.h>
bool flag;
int main(){
for (unsigned int k=2;k<=1000; k++){
flag=1;
for (unsigned int i=2;i*i<=k;i++){
if (k%i==0){
flag=0;
break;
}
}
if (flag==1){
printf("%d\n",k);
}
}
getchar();}
//このコードのほうがましでした。訂正します。しかし更に
//効率のいいコードがあるかもしれません。
No.4
- 回答日時:
#include <stdio.h>
#include <math.h>
#include <windows.h>
int flag=0;
int main(){
for (double k=2;; k++){
int square=(int)sqrt(k);
flag=1;
for (int i=2;i<=square;i++){
if ((int)k%i==0){
flag=0;
}
}
if (flag==1){
printf("%d\n",(int)k);
Sleep(100);
}
}
getchar();}
こんなのはどうでしょうか。参考にならなかったらごめんなさい。
No.3
- 回答日時:
このソース(ロジック)では剰余回数と素数の数が一致していませんので,素数であってもcounterが加算されません。
もし素数の数を求める場合は新しくカウンタ用の変数(int sosuCounter = 0;)を定義してから,次のif文内に追加すべきと考えます。
if (no == i) {
printf("%d\n" , no);
sosuCounter++; /* 素数表示回数をカウントする */
}
}
printf("乗除を行った回数:%lu 素数の数 : %d\n" , counter, sosuCounter);
☆全くはずしていたらごめんなさい。少しでも疑問が解決すれば幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
c言語
-
C言語での引数の省略方法
-
数字列を3桁ごとにカンマで区切...
-
【C++】関数ポインタの使い方
-
C言語_関数宣言_fprintfです!...
-
if と配列の組み合わせ
-
16進数の計算の仕方を教えて下さい
-
C言語 エラーの原因がわからな...
-
c言語の配列を使ってサイコロを...
-
C言語初心者です、、、お助けく...
-
C++でRPGを作成する際のステー...
-
四捨五入方法
-
ColorをRGBで指定する方法
-
問題がとけません
-
C言語 等差数列問題
-
引数 戻り値 return文について
-
配列のエラーが出る(opencv)
-
C言語の配列をC++のvectorに高...
-
16進数のままで加減乗除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
課題でつまってます・・・
-
c言語の配列を使ってサイコロを...
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報