a和b之间的总数,包含至少一个零

时间:2014-06-05 15:08:54

标签: c++ algorithm combinatorics

如何查找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

1 个答案:

答案 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)