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

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

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

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

JavaScript

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

Q&A

解決済

5回答

2788閲覧

1+2+3+…と足される数を1ずつ増やしながら足していき、和が1000を超えるときの足される数値と、合計値を表示するプログラムを作っています。

satomisato

総合スコア5

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

JavaScript

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

0グッド

0クリップ

投稿2020/04/08 00:19

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
JavaScript初心者です。
JavaScriptで1+2+3+…と足される数を1ずつ増やしながら足していき、和が1000を超えるときの足される数値と、合計値を表示するプログラムを作っています。
繰り返し回数が決まっていないのでwhile文を使うことだけは分かるのですが、条件式の部分をどうかけばいいのかが分からず、進めないままでいます。また、和が1000を超えるときの数値の出し方も全くわからないです。
どうか教えて頂ければと思います。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

//合計値を入れる
var sum = 0;

//1+2+3...とsumに足していく
var i = 0;
while (条件式) {
sum+= i;
i++
}

試したこと

どう書けばいいのかが全く分からないのでまずwhile文について調べてみましたが、繰り返し回数が決まっていない場合がwhile文、繰り返し回数が決まっている場合がfor文という認識をしました。ですが、いざコードをかこうとすると理解しきれていないのか条件式の部分が分かりませんでした。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

Q71

2020/04/08 00:28

「条件式がわからない」というのがわかりません。足すのを終えるのは、どういう条件の時ですか?「和が1000を超える時」ではないのですか?
guest

回答5

0

iをインクリメントするタイミングと、
sumの条件を確認するタイミング次第ですね

投稿2020/04/08 00:43

yambejp

総合スコア114585

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

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

yambejp

2020/04/08 00:44

var i=0,sum=0; while (sum<1000) { i++; sum+=i; } console.log([i,sum]);
satomisato

2020/04/08 01:00

ご返答ありがとうございます! 解決しました! とても分かりやすいご回答ありがとうございます。
yambejp

2020/04/08 01:06 編集

whileしない場合1からxまでの和をyとすると x*(x+1)/2=yなので x=(2*y+1/4)^1/2 -1/2 var y=1000; var x=Math.ceil((2*y+0.25)**0.5-0.5); y=x*(x+1)/2; console.log([x,y]);
satomisato

2020/04/08 07:24

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

0

ベストアンサー

「和が1000を超えるときの足される数値」
というのが1000が含まれるのかどうかによりますが、以下のような感じだと思います。

js

1//合計値を入れる 2var sum = 0; 3 4//1+2+3...とsumに足していく 5var i = 1; 6while (sum < 1000) { 7 sum+= i; 8 i++; 9}

条件式は、こちらも参考にしてください。
「sum < 1000」: 0〜999.999999...のとき
「sum <= 1000」: 0〜1000のとき

参考URL:
以上・以下・未満・超えるの違い 違いがわかる例文

投稿2020/04/08 00:32

編集2020/04/08 00:37
new1ro

総合スコア4528

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

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

satomisato

2020/04/08 00:54

なるほど!とても分かりやすいです! 解決することが出来ました。 ご丁寧にURLも貼っていただいてありがとうございます!!!
Lhankor_Mhy

2020/04/08 01:36

細かい話で恐縮ですが、これだと、「和が1000を超えるときの足される数値」より i の値が1多くなるんじゃないでしょうか。
satomisato

2020/04/08 07:22

iをインクリメントするタイミングと、sumの条件を確認するタイミングを逆にするということでしょうか? var i = 0; //和が1000を超えるまで、繰り返し処理を行う while (sum < 1000){    i++; sum += i; }
new1ro

2020/04/08 15:40 編集

Lhankor_Mhyさんのご指摘の通りであれば、例えば以下のようになるかと思います。 //合計値を入れる var sum = 0; //1+2+3...とsumに足していく var i = 1; while (sum + i < 1000) { sum+= i; i++; } while内に「console.log(sum);」を書き、意図した挙動になっている条件を探してください。
Lhankor_Mhy

2020/04/09 01:10

>satomisatoさん >iをインクリメントするタイミングと、sumの条件を確認するタイミングを逆にするということでしょうか? おっしゃるとおりです。 また、new1roさんの上記のコメントのコードでも動作します。
guest

0

解決済みだけど、無限ループで書いた場合のサンプルもあげておきます。

javascript

1//合計値を入れる 2var sum = 0; 3 4//1+2+3...とsumに足していく 5var i = 1; 6while(true) { 7 sum+= i; 8 //sumが1000を超えている場合、ループを抜ける 9 if(sum > 1000){ 10 break; 11 } 12 i++; 13} 14console.log([i,sum]);

投稿2020/04/08 01:05

kaina

総合スコア418

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

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

satomisato

2020/04/08 07:19

ありがとうございます!!! 勉強になります。
guest

0

足された値が1000を超えるかどうか、という条件式でやってみればどうでしょう

投稿2020/04/08 00:29

y_waiwai

総合スコア87719

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

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

satomisato

2020/04/08 00:43

ご返答ありがとうございます! こういうことでしょうか? //合計値をいれる var sum = 0; var i = 0; //和が1000を超えるまで、繰り返し処理を行う while (sum < 1000){ sum += i; i++; } //合計値 document.write(sum);
y_waiwai

2020/04/08 00:52

まずはそれでやってみて、結果を見て、あなたの思い通りになってるのかを見てみよう
satomisato

2020/04/08 01:06

ありがとうございます! 思い通りにいきました。 一応、修正点などがありましたら教えて頂きたいです。 //合計値をいれる var sum = 0; var i = 0; //和が1000を超えるまで、繰り返し処理を行う while (sum < 1000){ sum += i; i++; } //足される数値 document.write( i ); //結果46   //合計値 document.write(sum); //結果1035
guest

0

既に解決済みですが、質問者さんとは別のアプローチを書いてみます。

1からnまでの範囲の自然数の合計は(n + 1) * n / 2で求めることができます。
つまり合計がlimitを超える条件の場合、limit < (n + 1) * n / 2を満たす最小のnが欲しい値となります。
この数式を展開すると、0 < n^2 + n - 2 * limitとなります。(n^2はnの2乗と思ってください。)

2次元方程式の解法については、2次元方程式 解法とかでググるといろいろ見つかります。
私が探した中では、ここが比較的わかりやすかったです。

プログラムから求めると以下のようになります。

JavaScript

1const limit = 1000; 2 3const max = Math.floor((-1 + Math.sqrt(1 + 8 * limit)) / 2) + 1; 4console.log(max); // => 45 5 6const sum = ((max + 1) * max) / 2; 7console.log(sum); // => 1035

投稿2020/04/08 09:52

編集2020/04/09 02:40
draq

総合スコア2573

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

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

satomisato

2020/04/08 09:56

ありがとうございます!! まだまだ分からないことだらけなので、こういうご回答すごく勉強になります!
Lhankor_Mhy

2020/04/09 01:15

細かい話で恐縮なのですが、質問は「和が1000を超えるとき」なので、不等号が逆だと思います。
draq

2020/04/09 02:35

指摘ありがとうございます。問題読み違えてました。指摘内容を回答に反映しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問