算法题目---从1到n整数中1出现的次数

来源:互联网 发布:哪个mac地址 win10 编辑:程序博客网 时间:2024/06/14 02:05

输入一个整数n,求从1到这n个整数的十进制表示中1出现的次数。


int NumberOf1(unsigned int n)
{
    int number = 0;
    while(n)
    {
        if(n % 10 == 1)
            number++;
        n = n /10;
    }
    return number;
}

int NubmerOf1BetweenAndN_1(unsigned int n)
{
    int number = 0;
    
    for(unsigned int i = 1;i <= n;++i)
        number += NumberOf1(i);

    return number;
}

int PowerBase10(unsigned int n)
{
    int result = 1;
    for(unsigned int i = 0;i < n; ++i)
        result *= 10;
    
    return result;
}

int NumberOf2(const char *strN)
{
    if(!strN || *strN < '0' || *strN > '9' || *strN == '\0')
        return 0;

    int first = *strN - '0';
    unsigned int length = static_cast<unsigned int >(strlen(strN));

    if(length == 1 && first == 0)
        return 0;
    if(length == 1 && first > 0)
        return 1;

    int numFirstDigit = 0;
    if(first > 1)
        numFirstDigit = PowerBase10(length - 1);
    else if(first == 1)
        numFirstDigit = atoi(strN+1)+1;
    
    int numOtherDigits = first*(length -1 )* PowerBase10(length -2 );

    int numRecurive = NumberOf2(strN +1);

    return numFirstDigit + numOtherDigits + numRecurive;
}

int NubmerOf1BetweenAndN_2(unsigned int n)
{
    if(n < 0)
        return 0;
    char strN[50];
    sprintf(strN,"%d",n);
    return NumberOf2(strN);
}


void Test(char* testName, int n, int expected)
{
    if(testName != NULL)
        printf("%s begins: \n", testName);
    
    if(NubmerOf1BetweenAndN_1(n) == expected)
        printf("Solution1 passed.\n");
    else
        printf("Solution1 failed.\n");
    
    if(NubmerOf1BetweenAndN_2(n) == expected)
        printf("Solution2 passed.\n");
    else
        printf("Solution2 failed.\n");

    printf("\n");
}

void Test()
{
    Test("Test1", 1, 1);
    Test("Test2", 5, 1);
    Test("Test3", 10, 2);
    Test("Test4", 55, 16);
    Test("Test5", 99, 20);
    Test("Test6", 10000, 4001);
    Test("Test7", 21345, 18821);
    Test("Test8", 0, 0);

}

int main()
{
    Test();

    return 0;
}