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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

4439閲覧

素数の判定(1または2が入力されたら、入力をやり直させる)

9nagisa

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/08/03 07:24

###前提・実現したいこと
素数であるかどうかを判定するプログラムを作成したいのですが、”入力された数を引数とする関数を作成する”では、何の関数を使えばいいかわかりません。
また、”素数であるかどうかを判定”は基本はわかるのですが、”1または2が入力されたら、入力をやり直させるような機構”はどうやって作ればいいかわかりません。ネットで調べてもわかりませんでした(つД`) どなたか詳しい方がいらっしゃいましたら、よろしくお願いしますm(_ _)m

###発生している問題・エラーメッセージ
キーボードから入力された数値が素数であるかどうかを判定するプログラムを作成せよ。なお、素数であるかどうかを判定する部分は、入力された数を引数とする関数を作成すること。また、1と2は除外してよいので、キーボードから1または2が入力されたら、入力をやり直させるような機構を設けておくこと。

###該当のソースコード
ここにご自身が実行したソースコードを書いてください
#include<stdio.h>
int main()
{
int i;

int number;

int flag = 0;

printf("自然数 = ");
scanf("%d",&number);

for( i=2;i<number;++i ) {
if( number%i==0 ) {
flag = 1;
break;
}
}

if(flag==0);
printf("%d は素数です。\n",number);
else
printf("%d は素数ではありません。\n",number);

return 0;
}

###補足情報(言語/FW/ツール等のバージョンなど)
C言語

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

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

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

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

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

MMashiro

2017/08/03 07:30

ソースコードにはコードブロック <code>~</code> か ``` ~ ``` を使用しましょう。回答が得やすくなると思われます。
maisumakun

2017/08/03 07:30

2も素数なのに、「入力をやり直させる」というのも少し変わった仕様ですね。
_Victorique__

2017/08/03 07:47

1、2が入力されたらやり直させる意図が不明。1は非素数、2は素数で判定すれば良いのでは?
LouiS0616

2017/08/03 08:57

まずは、勉強の仕方を勉強した方がよいです。
WoodenHamlet

2017/08/04 00:13

質問テンプレート使っているのに、その恩恵であるところのMarkdownを削除してるって…。テンプレートを使用した時に質問フォームに書かれている記号類はゴミじゃありません。消さないようにしましょうというか、違う質問でも<code>ボタン使えって言ったじゃないですかー
guest

回答2

0

なんの関数を用いればいいか
自分で定義してください。こんな関数を作ればよいでしょう。
int is_prime(int num); // 素数だったら1を、違うなら0を返す


入力をやり直させる方法

C

1printf("自然数 = "); 2scanf("%d",&number);

この部分を、何らかのループで囲めばいいです。
do-while文が向いているんじゃないでしょうかね。

重要

コードはバッククオート三つで括ってください。
よくわからない場合は、マークダウン記法について調べてみてください。
これをしているかどうかで、回答の量と質が変わってきます。

投稿2017/08/03 07:28

LouiS0616

総合スコア35660

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

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

0

ベストアンサー

C

1#include <stdio.h> 2#include <math.h> 3 4int is_prime(int num) 5{ 6 int i; 7 8 for(i = 2; i <= sqrt(num); i++) 9 { 10 if(num % i == 0) 11 { 12 return 0; 13 } 14 } 15 16 return 1; 17} 18 19int main() 20{ 21 int n = 0; 22 23 do{ 24 printf("num = "); 25 scanf("%d", &n); 26 }while(n < 3); 27 28 printf("%d is %s.", n, (is_prime(n) ? "prime" : "not prime")); 29 30 return 0; 31}

LouiS0616様の回答を参考にして考えてみました。

参考にしたページ
入力した自然数が素数かどうかを判定
do~while文

#補足
LouiS0616様に教えていただいた所を書き換えました。

投稿2017/08/03 08:37

編集2017/08/03 09:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

LouiS0616

2017/08/03 08:44 編集

for文の継続条件は、i<=sqrt(num)で充分ですよ。 『折り返し地点』まで剰余判定が出来ればいいので。
退会済みユーザー

退会済みユーザー

2017/08/03 08:49

ご指摘ありがとうございます。ただ、私は 参考にしたページにあげた(URLが間違えていたので先ほど修正) 「入力した自然数が素数かどうかを判定」というページに書いてある 方法をぱくっただけで実際は素数の求め方を全く分かっていません。 ゆえに、ご指摘いただいてもどうしたらよいか分かりません。
LouiS0616

2017/08/03 08:52

というか、これ... 質問者さん(9nagisaさん)のコード、丸コピだったんですね... あたかも自分で考えたように書いていますが...
LouiS0616

2017/08/03 08:54

素数は、『1と自分自身以外で割り切れない自然数』です。 例えば12を素因数分解すると(1は端折る)、 12 = 2*6 = 3*4 = 4*3= 6*2 という風に左右対称ですので、『折り返し地点』以降の計算は不要です。
退会済みユーザー

退会済みユーザー

2017/08/03 09:05 編集

私もそう思いました。 コメントが行き違いになりました。 これは一つ上(2017/08/03 17:52)の LouiS0616様のコメントに対するコメントです。
退会済みユーザー

退会済みユーザー

2017/08/03 09:01

LouiS0616様 ご説明ありがとうございます。 理解できました。 入力値の平方根を上限にすることで 無駄な繰り返しを省けるとは 勉強になりました。 早速書き直します。
WoodenHamlet

2017/08/03 23:57 編集

is_primeの中の for 文の条件判定式の sqrt は最適化されるだろうか微妙な気がする、というかされないような。個人的には外に出しときたい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問