为什么spoj为这个" Even Count"的解决方案提供了错误的答案。

时间:2014-07-16 18:42:19

标签: c algorithm

我正在尝试解决有关spoj的GEEK 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 个答案:

答案 0 :(得分: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--)