1 #include <iostream>
 2 #include <string>
 3 #include <memory.h>
 4 #include <vector>
 5 #include <sstream>
 6 using namespace std;
 7 
 8 /*
 9 统计1~N之间1出现的次数:分别对当前位的高位和低位找规律。
10 其实这个问题可以扩展为统计1~N之间,m出现的次数0<=m<=9。
11 
12 思路:
13 对于当前位(出现m的次数):
14 如果小于m,只和高位有关系如m=1,N=203,那么十位出现的次数就是10~19,110~119;
15 如果等于m,m=1,N=213,十位出现次数是10~19,110~119,210~213;
16 如果大于m,m=1,N=223,十位出现次数是10~19,110~119,210~219;
17 */
18 //这个函数只求1出现的次数
19 int fun(int N)
20 {
21     if(N < 1)
22         return 0;
23 
24     stringstream ss;
25     ss<<N;
26     string s = ss.str();
27 
28     int len = s.length();
29     int i = len - 1;
30     int cnt = 0;
31     int num = s[i]-'0';
32     //处理最低位
33     if(num > = 1)
34         cnt = 1;
35     //处理最高位
36     stringstream ss1(s.substr(1,len-1));
37     ss>>num;
38     cnt += num+1;
39     for(i = 1 ; i < len-1 ; ++i)
40     {
41         num = s[i]-'0';
42         if(num > 1)
43         {
44             int num_higher = s[i-1]-'0';
45             cnt += (num_higher+1)*10;
46         }
47         else if(num == 1)
48         {
49             int num_higher = s[i-1]-'0';
50             int num_lower = s[i+1]-'0';
51             cnt += (num_higher)*10+num_lower+1;
52         }
53         else
54         {
55             int num_higher = s[i-1]-'0';
56             cnt += (num_higher)*10;
57         }
58     }
59     return cnt;
60 }
61 
62 int main()
63 {
64     return 0;
65 }

未测试版本