2017-10-31 10 views
0

n個の数字を入力し、正確に2 '9'の数字を入力する必要があります。 (たとえば、9193を入力するとプログラムがそれを入力しますが、73999または256を書き込むと出力は出ません)。 だから私はこのコード正確に2ナインの数字を見つける

int main(){ 
int a, n, i, count=0, y; 
cin>>n; 
for(i=1; i<=n; i++){ 
    cin>>a; y=a; 
    while(y>0){ 
     if(y%10==9) count++; 
     y=y/10; 
    } 
    if(count==2) cout<<a<<endl; 
} 
return 0; 
} 

を書きました。しかし、これは動作しない理由を私は理解できません。 私はそれを変更してこのように書くと動作します。

int main(){ 
int a, n, i, count, y; 
cin>>n; 
for(i=1; i<=n; i++){ 
      count=0; 
    cin>>a; y=a; 
    while(y>0){ 
     if(y%10==9) count++; 
     y=y/10; 
    } 
    if(count==2) cout<<a<<endl; 
} 
return 0; 
} 

これを私に説明していただければ幸いです。

+3

新しい番号ごとに 'count'をリセットする必要があります。これは、それぞれの番号が独自のカウント数を持つためです。それについて何が混乱していますか? –

+0

ああ、それは簡単でした:)助けてくれてありがとう:) – Lucy

+0

各 "数字"を 'std :: string'に読んでください。そのように文字を数えるほうがはるかに簡単です。 –

答えて

-1

すべての場合にcount=0を初期化する必要があります。

1

だけ(またはそれへの変換)文字列として読み込み、カウント:

for(i=1; i<=n; i++){ 
    std::string numstr; 
    std::cin >> numstr; 
    if(std::count(numstr.begin(), numstr.end(), '9') == 2) 
     std::cout << numstr << std::endl; 
} 
+0

おそらく関連性のないパフォーマンスの費用がかかる可能性があります。データを受け取るようにするには、cinがバッファをintに変換しなければならないため、おそらくぎこちないかもしれません。そして、あなたの解は負の数に対しても働きます。 (ささいなバグが修正されても、OPはそれをしないでしょう)upvoteをしてください。 – Bathsheba

1

をあなたは、あなたが新しい数のカウントを追加しているメインループを通じて0に毎回countをリセットしない場合前の番号からのカウントに加算します。

したがって、最初の数値に19と入力すると、count1に設定されます。次に、2番目の数字に939と入力すると、count3に設定され、テスト番号if (count == 2)は2番目の数字があっても成功しません。その後、countはあなたに追加し続けるので決して2になりません。

各番号の先頭からカウントを開始する必要があります。

アルゴリズムは負の数では機能しません。 -9 % 10はであり、9ではありません。

+0

負の入力でバグに言及するのを忘れないでください。 – Bathsheba

関連する問題