2016-07-05 10 views
0

Codility CountDiv Exercise正しい方法を理解していない:範囲A..Bおよび値Kが与えられるとはCodi​​lity CountDiv溶液が

、K.

によって例を割り切れる範囲内の値の数を返します6から11の範囲では、2で割り切れる数は6,8および10であるので、答えは3です。必要な解はO(1) - soでなければなりません簡単な計算が必要です。

あなたはAとBは、範囲0..2,000,000,000であり、Kは1..2,000,000,000であり、0 <が< = B.

スコア100%通りであることが認められた溶液を、=ことと仮定することができます以下:私は混乱

int solution(int A, int B, int K) 
{ 
    int inclusive = ((A%K)==0) ? 1 : 0; 
    return (B/K) - (A/K) + inclusive; 
} 

私は入力A = 0を有するこの溶液、B = 0、K = 1をテストする場合、結果が1であるということですか? 0〜0の範囲では、1で割り切れる値の数は... 0と考えていたでしょう。

私はこれがエラーであると考えていました.Aのインクルーシブ値の+1は、Aがゼロ以外の場合にのみ設定する必要があります。

だから私は、以下の溶液(Aが非ゼロであることをテスト)を提出した:

int solution(int A, int B, int K) 
{ 
    int inclusive = (A && (A%K)==0) ? 1 : 0; 
    return (B/K) - (A/K) + inclusive; 
} 

しかし、これは62%(50%の正確さと75%の性能)を獲得しています。それが失敗したテストケースの一部であった:

  • A = 0、B = 1、K = 11 - ガット0は、予想される1
  • A = 0、B = MAXINT、中K {1、MAXINT} 、2000000000、予想2000000001

誰かが説明できますか?

答えて

3

0は、すべてがK(0以外)の場合、Kで割り切れます。ゼロについて特別なものは何もありません。分割可能とは、分割後に残余がないことを意味します。

2

範囲は以下のとおりです。00の範囲内に1つの値があります。値は0です。すべての値は1で割り切れるので、結果は実際には1の値です。提案されたコードは冗長である

注:

int inclusive = ((A%K)==0) ? 1 : 0;int inclusive = (A%K)==0;と等価です。さらに、int inclusive = !(A%K);ように簡略化することができ、完全なソリューションをワンライナー次のようになります。

int solution(int A, int B, int K) { return B/K - (A ? (A-1)/K : -1); } 

int solution(int A, int B, int K) { return B/K - A/K + !(A%K); } 

そして、ここでは、唯一の2部門を有する変異体であります