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 }
未测试版本