2017-01-25 3 views
0

以下の解決策はまだX3、X5とX15用のintので、正しい結果を返し、なぜ私が理解した上で問題を抱えていますJavaのプロジェクトオイラー#1 - なぜ結果は正しく切り捨てられますか?

「1000以下の3または5の全ての倍数の和を探します」分割後つまり、除算の結果は常に切り捨てられ、小数は無視されます。

3つのintすべてをdouble型に置き換えようとしたとき、私は間違った結果を得ました。

溶液は、以下の観察に基づいている:

1 + 2 + ... + N = N *(N + 1)/ 2

public static void main(String[] args) { 
    int nr = 1000; 
    nr--; 
    int x3 = nr/3; 
    int x5 = nr/5; 
    int x15 = nr/15; 

    long sum1 = 3*x3*(x3+1); 
    long sum2 = 5*x5*(x5+1); 
    long sum3 = 15*x15*(x15+1); 

    long sum = (sum1+sum2-sum3)/2; 
    System.out.println(sum) 
} 

Reference

+0

あなたはループに精通していますか? –

+1

@Mohsen_Fatemiこれにはループは必要ありません。 –

+0

@Mohsen_Fatemiは[Carl Friedrich Gaussの先生がクラスをしばらく忙しくしていた時の話](https://nrich.maths.org/2478)に精通していますか? (そして、[inclusion-excluclusionの原理](https://en.wikipedia.org/wiki/Inclusion%E2%80%93exclusion_principle)) –

答えて

0

3つのintをすべてdouble型に置き換えようとしたとき、私は間違った結果を得ました。 199.8正の数が5で割り切れる1000未満がない、199

があります。除数で割り切れる数の小数が存在しないので、あなたは、整数の除算からフローリングを行う必要があり

だから、doubleを使用することにより、あなたは合計を過大計測している:

sum2 = floor(5 * 199.8 * 200.8) = floor(200599.2) = 200599 
    vs 
sum2 = floor(5 * 199 * 200 ) = floor(199000 ) = 199000 
0

整数X3、X5、およびX15は、単にあるNの倍数は、どのように多くの正の整数少ないMよりも」、質問に答えますか? " Javaで定義されているかの正の整数除算であることを起こる

M Count 
1 0 
2 0 
3 0 
4 1 
5 1 
6 1 
7 2 
... 

あなたが見ることができるように

、答えの一般化が Count = floor((M - 1)/N)で、:ここではN = 3のとき、これを示したテーブルです。

これは、上記のコードから唯一切り捨てられた整数除算であるため、この丸めがあなたが求めていたものであると推測しました。例として3をとる

0

3によって割り切れると1000未満の数の合計である:(3 + 6 + 9 + 12 + ... + 999)上記

3 * (1 + 2 + 3 + .... + 333)のように書き換えることができます。そして333 = integer part of (999/3)。それはfloor(999/3)と書くこともできます。

合計(1 + 2 + 3 + .... + 333) = 333 * (333 + 1)/2またはfloor(999/3) * (floor(999/3) + 1)/2 = 55611です。これはまさに上記のコードによって行われていることです。 intを使用すると、floor操作を簡単に実行できます。

doubleを使用した場合、55722.11155611とは異なる333.333 * (333.333 + 1)/2となります。それはあなたが見ている不一致をもたらします。

関連する問題