2016-03-20 19 views
0

私は数学の問題を解決するために、特定の範囲内の整数に関するデータを得るために特別な条件を使用しています。forループは何もログに記録しません

私はforループを使用して、範囲内の数値を増分し続けます(1〜2000)。別のforループは、整数の各桁に7が含まれているかどうかをチェックし、整数の場合はコンソールに記録します。

var i; 
for (i = 1; i < 2001; i++) { 
    for (var index = 0; index <= i.length; index++) { 
     if (i.substring(index, index + 1) == 7) { 
      console.log(i); 
     } 
    } 
} 

現在、私は、ちょうどundefined何も出力を得ていませんよ。エラーメッセージもありません。


内部ループが故障しているようです。

for (var i = 1; i < 2001; i++) { 
    for (var index = 0; index <= i.length; index++) { 
     console.log(index); //No output - undesired 
    } 
    console.log(i); //Prints out i from 1 to 2000 - desired 
} 

なぜコードに適切な数値が記録されないのですか?

+1

i'は数ある '以来、それはありません括弧のための長さ –

答えて

1

数値には文字列プロパティがないため。文字列に変換する

for (var i = 1; i < 2001; ++i) 
    for (var i_str = i.toString(), index = 0; index <= i_str.length; ++index) 
    if (i_str.substring(index, index + 1) == 7) 
     console.log(i); 
+0

1を持っているdosent、と私の問題を解決しました。 btwなら '.length'を' toString() 'と直接使用して、' index <= i.toString()。length'のように余分な変数( 'i_str')の必要性を取り除くことができます。 – leDominatre

+0

@scriptHeroはい。しかし、各繰り返しで文字列を再作成します。また、 'substring'の文字列も必要です。 – Oriol

+0

繰り返しごとに文字列を再作成する際に問題がありますか?私は不確実だが、2000年の点検では、パフォーマンスはそれほど重大な問題ではないはずである。 – leDominatre

2

iは整数です。 i.lengthは未定義です。 lengthは、文字列オブジェクトと配列オブジェクトのプロパティですが、整数ではありません。したがって、forループはindex <= undefinedを比較しています。この比較はfalseで、実際にはforというループを入力することはありません。

+0

これは半分の答えです。もう半分は '0 <= undefined'が' false'です。 –

+0

非常に良い点。編集されました。 –

+2

実際に私は間違っていました。それは 'NaN'に強制され、' 0'には強制されません。 –

1

上記のように開始されたiは数字であり、文字列プロパティはありません。それは二重ループなしでより良い読む。代わりにmatchを使用してください:

for (var i = 1; i < 2001; ++i) { 
    if (i.toString().match(/7/g) != null) { 
     console.log(i); 
    } 
} 
+0

_「それはもっと読みやすいですよ」_確かに、それはより良く見えます。しかしOriolのソリューションよりも優れていますか? – leDominatre

+1

はい、これはかなり早いです。 (254ms対345ms)。それは2kのループでは重要ではありませんが、より大きな数値/ループでは大きな節約になります。それは、私は最適化する必要があるまで、わかりやすく説明しています。この場合ループと番号がハードコードされているので、この場合は起こりません。 – Bruno

関連する問題