Snedden27:
私は数がゼロの末尾の数字を見つけようとしています、ここに私のコードは次のとおりです。
public class TrailingZeroes {
public static void bruteForce(int num){ //25
double fact = num; //25
int numOfZeroes = 0;
for(int i= num - 1; i > 1; i--){
fact = fact * (i);
}
System.out.printf("Fact: %.0f\n",fact); //15511210043330984000000000
while(fact % 10 == 0){
fact = fact / 10;
double factRem = fact % 10;
System.out.printf("Fact/10: %.0f\n",fact); //1551121004333098400000000
System.out.printf("FactRem: %.0f\n",factRem); // 2?
numOfZeroes++;
}
System.out.println("Nnumber of zeroes "+ numOfZeroes); //1
}
}
あなたは事実%10を見ることができるように
oleg.cherednik:
あなたは、使用ポイント浮動違法にデータ型を。
float
そしてdouble
Javaでプリミティブ型である点フローティング数は分数と指数のバイナリ表現として記憶される数値を、。
より具体的には、倍精度などの浮動小数点値double
のタイプは、64ビット値は、次のとおりです。
- 1ビットは符号(正または負)です。
- 指数のための11ビット。
- 有効数字のための52ビット(バイナリとして小数部分)。
これらの部品は製造するために結合されるdouble
値の表現。
浮動小数点値はJavaで処理する方法の詳細については、を参照浮動小数点型、フォーマット、および値:4.2.3 Java言語仕様のを。
byte
、char
、int
、long
タイプは数字の正確representionsある[固定小数点] [6]の数字です。固定小数点数とは異なり、浮動小数点数は、いくつかの回(「ほとんどの時間を」前提とする安全では)数の正確な表現を返すことはできません。これは、あなたがで終わる理由でもある11.399999999999
の結果として5.6 + 5.8
。
こうした1.5または150.1005として、正確な値を必要とするとき、あなたは正確に数を表すことができるようになりますこれは、固定小数点タイプのいずれかを使用したいと思います。
すでに何度か述べてきたように、JavaがありBigDecimal
、非常に大きな数字と非常に小さい数字を処理するクラスを。
public static void bruteForce(int num) { //25
double fact = num;
// precision was lost on high i
for (int i = num - 1; i > 1; i--)
fact *= i;
String str = String.format("%.0f", fact); //15511210043330984000000000
System.out.println(str);
int i = str.length() - 1;
int numOfZeroes = 0;
while (str.charAt(i--) == '0')
numOfZeroes++;
System.out.println("Number of zeroes " + numOfZeroes); //9
}