🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

372閲覧

for文, return についてわからないことがあります(Javascript)

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/12/17 18:48

編集2019/12/17 19:24

前提・実現したいこと

プログラミングの練習課題を取り組んでいて、わからないことがあります(Javascript)
(Javascript)

該当のソースコード 2以上の整数をテキスト入力エリアから入力し、それが 素数 (1 とその数自身でしか割り切れない数) ならば「素数です」そうでないならば「素数ではありません」というアラート を表示するプログラムを書きなさい。ただし、下記の指示の部分のみ埋めなさい。

Javascript

1<input type="text" id="num" onchange="isPrime()"> 2 <script type="text/javascript"> var element = document.getElementById("num"); function isPrime() { 3 var n = element.value; 4 for(i = n - 1; i > 1; i--) { 5 if(n % i == 0) { 6 alert("素数ではありません"); 7 return; 8 } 9 } 10 alert("素数です); 11

上に記載したのがこの問題の解答なのですが、
for文のかっこの中の、そもそもなぜiが-1されているところから始まるのか、なぜiが1より大きい時に、-1をするのかが、わかりません。

また、この場合は、なぜreturnを書くことが必要なのですか?

初歩的な質問で申し訳ございません。よろしくお願い致します。

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

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

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

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

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

kei344

2019/12/17 19:08

本文及び質問タイトルなどにある「(Javascript) 」は不要です。(質問タグで示しているため) コードは行番号など使わず、コードブロックを使ってください。コードブロックは ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。 【対応しているMarkdownの記法を知りたい|ヘルプ|teratail(テラテイル)】 https://teratail.com/help#about-markdown
退会済みユーザー

退会済みユーザー

2019/12/17 19:25

ありがとうございます。
m.ts10806

2019/12/17 21:50

>(Javascript) これも指摘されてるので消しといてくださいね。連呼されなくてもタグでわかります
m.ts10806

2019/12/17 21:52

>初歩的な質問で申し訳ございません。 こちらについても質問に「初心者アイコン」をつけられるのでそちらつけるだけで十分です
guest

回答3

0

ベストアンサー

本題ではありませんが、この方法は効率が悪いです。

  • ランダムに整数を選んだ場合、それが2の倍数である確率は2分の1、3の倍数である確率は3分の1…といった感じとなるので、小さい方から回したほうが早くヒットする確率が高いです。
  • a = b * cのように割り切れる場合、bcのどちらか一方はaの平方根以下なので、それより大きい数はチェックする必要がありません。

(もっといろいろ考えればさらに効率化できますが、ごく単純なところでこの2つを挙げておきます)

投稿2019/12/17 23:37

編集2019/12/18 02:52
maisumakun

総合スコア145971

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

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

退会済みユーザー

退会済みユーザー

2019/12/19 10:27 編集

ありがとうございます。 小さい数から評価する場合、どのように書けば良いでしょうか? <!DOCTYPE html> <html> <head> <title>sosu</title> <meta charset="utf-8"> </head> <body> <p>2以上の数字を入力してください</p> <input type= text id="Number" onchange="isPrime();"> <script type="text/javascript"> function isPrime(){ var input = document.getElementById("Number"); var n = input.value; if ( n ==2 ){ alert("素数です"); } for(var i = 2; i< n; i++ ){ if(n%i == 0){ alert("素数じゃないです"); return; } else{ alert("素数です"); return; } } } </script> </body> </html> このように書くと、365などの数字を入れると、素数ですと出てしまいます
guest

0

なぜiが-1されているところから始まるのか

数学的理由です。

素数は「1と自分自身以外に約数を持たない数」と習いますが(私は失念してたので、Google先生に聞きました)、「約数」を評価するのに入力値以上の数を評価する必要はありません。

このため、自身の数-1 を初期値にし、1よりも大きい間、デクリメントしています。

この場合は、なぜreturnを書くことが必要なのですか?

一気に関数を抜けるためです。

もし、break 文で抜けると、alert で 「素数ではありません」をクリックしたあと、立て続けに「素数です」と惚けたコードになってしまいます。
利用者にとっては、「どっち?」と聞き直したくなる結果となるからです。

javascript

1var element = document.getElementById("num"); 2function isPrime() { 3 var n = element.value; 4 for(i = n - 1; i > 1; i--) { 5 if(n % i == 0) { 6 alert("素数ではありません"); 7 return; 8 } 9 } 10 // break の場合、for ブロックの直後から続きの処理に移る 11 alert("素数です"); 12} // return の場合、関数も抜ける

投稿2019/12/17 22:06

AkitoshiManabe

総合スコア5434

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

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

退会済みユーザー

退会済みユーザー

2019/12/19 15:18

ありがとうございます!
guest

0

for(i = n - 1; i > 1; i--) {

if(n % i == 0) { alert("素数ではありません"); return;

このとき、i = n だった場合に次のif文でなにが起きるのか考えてみましょう。

投稿2019/12/17 23:41

編集2019/12/17 23:42
y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2019/12/19 15:19

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問