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

来源:互联网 发布:万能看图王pdf 软件 编辑:程序博客网 时间:2024/05/19 01:33

题目描述

求出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;}

0 0