2016-07-05 68 views
0

Codility CountDiv Exercise不明白Codility CountDiv解決方案如何正確

給定一個範圍A..B和K值,返回的範圍內,通過K.

的例子是整除值的數量定爲A = 6,B = 11和K = 2。在範圍6至11,由2是6,8和10整除數,所以答案是3必須爲O所需的溶液(1) - 因此需要一個簡單的計算。

可以假定A和B是在範圍0..2,000,000,000,K是1..2,000,000,000和0 < = A < = 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!

我認爲這是一個錯誤,該+1 A的包容性價值才應該設置如果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} ,得到了20億,預計2000000001

有人能解釋一下嗎?

回答

3

對於允許(非零)的所有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/K + !(A%K); } 

這裏是一個變種,只有兩個分部

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