您的位置:首页 > 其它

整数中1出现的次数(从1到n整数中1出现的次数)

2015-09-02 16:31 357 查看


题目描述

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
#include <iostream>

using namespace std;

int Power10Base(int length)
{
	int result =1;
	for(int i =0 ;i < length;i++)
		result *= 10;
	return result;
}

int NumberOf1(char* str)
{
	if(!str || *str < '0' || *str > '9' || str == '\0')
		return 0;

	int first = *str -'0';
	int length = strlen(str);

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

	int NumberOfFirst = 0;
	if(first > 1)
		NumberOfFirst =  Power10Base(length -1);
	else if(first == 1)
		NumberOfFirst = atoi(str + 1) + 1;

	int NumberOfOthers = first * (length -1) * Power10Base(length -2);

	int NumberRecurse = NumberOf1(str + 1);

	return (NumberOfFirst + NumberOfOthers + NumberRecurse);
}

int NumberOf1Between1AndN(unsigned int n)
{
	if(n < 0)
		return 0;
	char str[50];
	sprintf(str,"%d",n);
	return NumberOf1(str);
}


// ====================测试代码====================
void Test(char* testName, int n, int expected)
{
    if(testName != NULL)
        printf("%s begins: \n", testName); 
    
    if(NumberOf1Between1AndN(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(int argc, char* argv[])
{
    Test();

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: