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

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

ただいまの
回答率

88.11%

javascriptのプログラミングが分かりません

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,541

score 41

任意の 0でない自然数 n をとり、 n が偶数の場合は n を2で割り、 n が奇数の場合は n に 3をかけて 1を足す。」という操作繰り返すと、有限回で1に到達するという 「コラッツの問題」。これを 1,000 から 5,000の任意自然数について確かめるプログラム作成したいんですがうまくいきません。

ちなみに「1,000から5000までの自然数(n)を入力して下さい」というダイアログボックスを表示した後、
alertでそれ以外の数字を入力してしまった場合は「入力した自然数(n)が間違っています。」を表示します。
逆に入力した数字が条件内であれば「入力した自然数(n)は[n]です。」と表示し改行した後1に達するまで「n=[n]は偶数:[n]/2=[n/2]」or「n=[n]は奇数:[n]*3+1=[n*3+1]」を計算し表示し続けるものになります。

一応、自分が書いたプログラムはこんな感じです。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>コラッツ</title>
  </head>
    <body>
      <script>
        var i = prompt("1,000から5,000までの自然数(n)を入力して下さい。","");
         if(i<1000||5000<i){
        var i = alert("入力した自然数(n)が間違ってます。");
        }else{
        document.write("<p>入力した自然数(n)は" + i + " です。</p>");
          while(i!=0){
            if(i%2==0){
            document.write("<p>n=" + i + "は偶数:" + i + "/2=" + i/2 +"</p> ");

            }else{
            document.write("<p>n=" + i + "は奇数:" + i + "*3+1=" + i*3+1 +"</p> ");

            }
           return i;
          }
        }
  </script>
  </body>
</html>


よろしくお願いします。

<追記>

while文のループをnが1に達したら抜け出せるようにしたいのですがどうしたらいいのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/06/07 18:08

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • masaya_ohashi

    2016/06/07 18:09

    HTML部分は```で囲むと見やすくなります。

    キャンセル

  • masaya_ohashi

    2016/06/07 18:34

    「、(読点)」ではありません。Shiftを押しながら@の「`」です

    キャンセル

  • masaya_ohashi

    2016/06/07 19:03

    回答に合わせて質問文を修正するのは、本質でない箇所だけにしないと後から見た人が「なにが間違っていたのか」がわかりません。動かなかったころのコードを変えてはいけません。

    キャンセル

回答 3

checkベストアンサー

+2

whileの条件が、このままではi==1に到達しても終わらないので、条件文を直しましょう。
それと、iを更新するヒントです。自分で考えてみてください。

if(i%2==0){ 
    document.write("<p>n=" + i + "は偶数:" + i + "/2=" + i/2 +"</p> "); 
    // iを割る2したものiに入れなおす処理をここに書きましょう
}else{ 
    document.write("<p>n=" + i + "は奇数:" + i + "*3+1=" + i*3+1 +"</p> "); 
    // iに3を掛けて1を足したものをiに入れなおす処理をここに書きましょう
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/07 18:55

    whileの条件を1に達する以外で終わらすにはどのような考え方をしたらいいのでしょうか?

    キャンセル

  • 2016/06/07 18:56

    今のコードはiが0でない間継続するようになっています。
    iが1より大きい間、と条件を変えてみてはどうでしょう。

    キャンセル

  • 2016/06/07 19:02

    while(i!=0)をwhile(1<i)に修正したらできました!
    ありがとうございます!

    キャンセル

+1

return i;


この一行で処理中であろうとループを抜けてしまっています。
また、iの値が更新されないため、whileループが無限に回り続けるようになっています。そこを修正してみましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/07 18:18

    こちらでも回してしまって、えらい目に合いましたw
    ちゃんと見てから動かせばよかった^^;

    キャンセル

  • 2016/06/07 18:25

    while文のループをnが1に達したら抜け出せるようにしたいのですがどうしたらいいのでしょうか?

    return i;の件申し訳ないです。修正しました。

    キャンセル

+1

n が偶数の場合は n を2で割り、 n が奇数の場合は n に 3をかけて 1を足す

この処理が抜けています。プログラムで言えば n は i ですから、この文の処理になるように処理を追加したら動くはず。

while(i!=0){
  if(i%2==0){
    document.write("<p>n=" + i + "は偶数:" + i + "/2=" + i/2 +"</p> ");
    i=i/2;   //←これを追加
  }else{
    document.write("<p>n=" + i + "は奇数:" + i + "*3+1=" + i*3+1 +"</p> ");
    i=i*3+1;   //←これを追加
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/07 18:56

    プログラムのほう、修正して実行したのですがやはりwhileのループから抜け出せず実行結果が表示されません。

    キャンセル

  • 2016/06/07 19:10 編集

    while(i!=1)
    にすれば抜けるはず。

    キャンセル

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る