我正在尝试解决有关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)));
}
}
请帮帮我。即使您可以向我提示错误答案即将来临的测试用例,这也将是一个很大的帮助。
答案 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--)