2014-07-16 162 views
0

我正試圖解決關於spoj的GEEK COUNT問題。我對這個問題的方法是首先找到所有奇數的數字,然後從給定的數字中減去它。爲了找到所有奇數的數字,我使用簡單的置換。 它給了我所有可能的測試用例的正確答案。我試圖用蠻力的方法進行交叉檢查,但仍然無法找到錯誤解決方案的測試用例。爲什麼spoj給出了這個「Even Count」解決方案的錯誤答案

#include<stdio.h> 
unsigned long long int myPow(unsigned long long int N, unsigned long long int k) 
{ 
    unsigned long long int result; 
    if(k==0) 
     return 1; 
    if(k==1) 
     return N; 
    result=myPow(N,k>>1); 
    if(k%2==1) 
     return result*result*N; 
    return result*result; 

} 
unsigned long long int solveForLessThan(unsigned long long int N) 
{ 
    unsigned long long int result,temp_N; 
    int power=0,digits[20],flag=0; 
    temp_N=N; 
    result=0; 
    while(temp_N/10!=0) 
    { 
     result+=myPow(5,power+1); 
     digits[power]=temp_N%10; 
     power++; 
     temp_N=temp_N/10; 
    } 
    digits[power]=temp_N; 
    while(power>0) 
    { 
     if(digits[power]%2==0) 
     { 
      result+=(digits[power]/2)*myPow(5,power); 
      flag=1; 
      break; 
     } 
     else 
     { 
      flag=0; 
      result+=(digits[power]/2)*myPow(5,power); 
     } 
     power--; 
    } 
    if(!flag) 
    { 
     result+=((digits[power]+1)/2); 
    } 
    return N-result; 
} 

int main() 
{ 
    int test_cases; 
    unsigned long long int L,R; 


    for(scanf("%d",&test_cases);test_cases>=0;test_cases--) 
    { 
     scanf("%llu",&L); 
     scanf("%llu",&R); 
     printf("%llu\n",(solveForLessThan(R)-solveForLessThan(L-1))); 

    } 
} 

請幫我一把。即使您只是提示錯誤答案即將出現的測試用例,這也會是一個很大的幫助。

回答

1

我認爲問題在於打印答案。

在此代碼:

for(scanf("%d",&test_cases);test_cases>=0;test_cases--) 

假設test_cases = 1

的循環將執行,那麼test_cases變爲0,然後循環將再次執行。

因此,您打印最後一個答案兩次。

嘗試:

for(scanf("%d",&test_cases);test_cases>0;test_cases--) 
+0

喔天啊,這樣愚蠢的錯誤讓我覺得像我自己殺人。我非常抱歉問這個問題,並且非常感謝你們對我使用「愚蠢」的詞,並給我答案。 – Naman

+0

沒問題,你顯然是通過測試一個強力方法來努力工作的,而且我對了解你的方法很感興趣。很有趣的是,for循環看起來完全正確 - 我在編寫自己的強力程序後才發現錯誤,與... –

+0

再次感謝您的幫助。我真的很感激它。 – Naman

相關問題