2017-07-14 8 views
-5

数字の後ろにあるゼロの数を見つけたかったので、次のコードを作成しました。特定の数字ではうまくいきましたが、数字が大きいほど異常を示し始めました。 "12345678"という数字を入力したときと同じですが、0が正しく表示されますが、 "123456789"と入力すると1つのゼロが表示されます。私のコードに間違いがありますか?数字の末尾のゼロの数を見つける

#include<iostream> 
#include<math.h> 
using namespace std; 

int main(){ 
int n = 0; 
float s; 
cin>>s; //the number to be given as input 
for(int j = 0;j <100;j++){ 

s = s/10; 
if(s == floor(s)){ 
n++; 
}else{ 

break; 
} 
} 
cout<<n<<endl; 
return 0; 
} 
+4

BTW 'n'は初期化されていません。 –

+9

もし私があなただったら、数字を 'std :: string'に読み込み、文字列の最後からゼロを数えます。 – NathanOliver

+1

'float'は精度が限定されています。あなたは最後の桁を落とす可能性が高いです。数字1.2345678E7には何個の0がありますか? –

答えて

-2

ここで私はあなたの個々の数字に を抽出し、任意の数の種類をカウントするための非常に簡単なコードを与えています。

int countZero(int x){ 
    int t = x; 
    int s = 0; 
    while(t > 0){ 
     if(t %10 == 0){ 
     s++; 
      } 
    t = t/10; 
    } 
    return s; 
} 
+1

この解決策には最終的に同じ問題OPがあります。入力に数字を追加し続けると、最終的には失敗します。さらに、問題は彼の例が間違っているかを尋ねることです。代替解決策を提示しても、この問題には対処できません。 –

+0

数字が文字列である場合、 'number [i] == 0'のような数字にアクセスできます。剰余または分割の必要はありません。 –

3

浮動小数点数の精度は限定されています。通常、floatは32ビットの数値、doubleは64ビットの数値です。浮動小数点数は、数値が16777216(2^24)以下の場合は正確に格納できます。

したがって、123456789をfloat変数に読み込んだときに値が異なると、123456792になります。この時点で、末尾のゼロをカウントする根拠はありません。

doubleは、9007199254740992(2^53)以下の整数を正確に格納できます。

unsigned long long intは、2^64未満の整数を格納できます。この方法を選択する場合は、末尾のゼロをチェックするためにこの条件を使用します。if (number%10==0)

末尾のゼロだけをカウントする場合は、std::stringを代わりに使用します。この方法で、あなたは好きなだけ大きな数字を扱うことができます。

関連する問題