2014-07-16 124 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

相关问题