質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

3415閲覧

素数を出力

nao0827

総合スコア14

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/01/09 02:54

編集2022/01/12 10:55

c言語
入力した数までの素数を出力するプログラムの
偶数をチェック対象から外した場合です
これを3の倍数をチェック対象から外した場合に
書き直したものを教えて下さい
for文とif文のみのプログラムで教えて頂けると
嬉しいです

#include "stdafx.h"

int main(void)

{
int num, msr, cnt, lmt, cnt2;
printf("整数を入力 ");
scanf_s("%d", &lmt);
printf(" 2\t");
cnt2 = 0;
for (num = 3; num <= lmt; num += 2){
cnt = 0;
for (msr = 3; msr <= num; msr += 2){
if (num%msr == 0)
cnt++;
cnt2++;
}
if (cnt == 1)
printf("%4d\t,num");
}
printf("\nの演算回数: %d\n", cnt2);

return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2016/01/09 02:55

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
izkn

2016/01/09 02:57

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
takito

2016/01/09 03:02

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
ikuwow

2016/01/09 03:10

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
KoichiSugiyama

2016/01/09 07:32

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
KoichiSugiyama

2016/01/09 07:33

どこまで自力でやってみて、どういう点が判らなかったのか明確に書いた方が参考になるアドバイスが集まりやすいと思います。
tanat

2016/01/09 13:50

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答2

0

2 の倍数でない、かつ 3 の倍数でない数は 6m + 1, 6m + 5 の形のものです。
これらの数字についてチェックする形のコードを書いてみました。
1.c

c

1#include <stdio.h> 2int cnt2 = 0; 3int delta[] = {1, 5}; 4 5// num (6m + 1 か 6m + 5) が素数か判定する 6// 1: 素数、0: 素数ではない 7int check(int num) { 8 if (num % 5 == 0) { 9 cnt2++; 10 return 0; 11 } 12 13 int cnt = 0; 14 for (int msr = 6; msr <= num; msr += 6) { 15 for (int p = 0; p < 2; p++) { 16 int work = msr + delta[p]; 17 if (num <= work) { 18 cnt2++; 19 return 1; 20 } 21 if (num % work == 0) { 22 cnt2++; 23 return 0; 24 } 25 } 26 } 27 return 1; 28} 29 30int main(void) { 31 int lmt; 32 printf("整数を入力 "); 33 scanf("%d", &lmt); 34 printf(" 2\t 3\t 5\t"); 35 // 6m + 1, 6m + 5 に対して、素数かを判定していく。 36 // (これは 2 の倍数でも 3 の倍数でもない) 37 for (int num = 6; num < lmt; num += 6) { 38 for (int p = 0; p < 2; p++) { 39 int work = num + delta[p]; 40 if (work >= lmt) { 41 break; 42 } 43 if (check(work)) { 44 printf("%4d\t", work); 45 } 46 } 47 } 48 printf("\nの演算回数: %d\n", cnt2); 49 return 0; 50}

実行例

$ gcc 1.c $ ./a.out 整数を入力 1000 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 の演算回数: 331

投稿2016/04/02 16:35

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

丸投げな質問ですね。答えを教えるのはよろしくないですので、意見とヒントだけ。

2の倍数はチェックして3の倍数をチェックしないのでしょうか?
頑張ればできると思いますが、プログラムを面倒にした上、今まで半分チェックを省略してたのに1/3しか省略しなくなりますね。苦労して性能を劣化させるって、何を狙っているのでしょうか?

そうではなく、2の倍数と3の倍数の両方をチェックしないのでしょうか?
YESなら、単純に3で割って余りが0なら、continueするだけで良いように思います。
外側のループにだけ入れる分には、数字が大きい時に効果がありそうな気がします。
内側のループにまで入れると却って遅くなるだけと思います。

投稿2016/01/09 13:44

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問