如何查找a和b(包括)之间的数字计数,其中包含0作为其数字。我无法用我在下面的代码中使用的想法得到这个,在前导零的情况下变得非常复杂
对于ex,如果a = 1且b = 200总数应为29但我得到39。
有人能建议一种有效的方法吗?
约束:
1<=a<=b<=10^17
代码:
long long int F(long long int dig, long long int a, long long int num)
{
if(dig == 0) {
if(a>0)
return 1;
else
return 0;
}
if(mem[dig][a])
return D[dig][a];
mem[dig][a] = 1;
long long int ret = 0;
for(long long int i = 0;i<=9;i++) {
if(i==num)
ret=(ret+F(dig-1,a+1,num));
else
ret=(ret+F(dig-1,a,num));
}
D[dig][a] = ret;
return ret;
}
long long int solve(long long int x,long long int num)
{
char cad[100];
long long int ret = 0;
long long int a=0,b=0,c=0,j;
sprintf(cad,"%lld",x);
int len = strlen(cad);
long long int qued = len;
for(long long int i = 0;i < len;i++) {
qued--;
long long int d = cad[i] - '0';
for(j=0;j <d;j++) {
if(j==num) {
if(num==0 && i==0)
a=a+0;
else
a=a+1;
ret=(ret+F(qued,a,num));
}
else
ret=(ret+F(qued,a,num));
}
if(d==num)
a=a+1;
}
return ret;
}
解决方案是 - &gt;解决(B + 1,0)-solve(A,0)
但是我的回答是错误的
我得到上述想法的链接是http://codeforces.com/blog/entry/8221
答案 0 :(得分:0)
一种简单的方法是:
inList = [1, 2, ... n]
outList = []
for i in inList:
for j in len(i):
if i%10 || i==0:
//there is a 0
outList.add(i)
break;
if(i<10)
//i cannot contain a 0
break;
i=i/10
可能只适用于积极的整数,但是它可以解释负数。
根据您的约束,简单高效的O(10N)或O(17N)