分析:
第一、最简单的思路:
从1到n的各个数,一个一个处理,复杂度是O(N*lnN)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int countOneNum(int n)
{
int ret=0;
while(n)
{
if(n%10==1)
{
ret+=1;
}
n/=10;
}
return ret;
}
int countOneNumSum(int n)
{
int total=0;
for(int i=1;i<=n;i++)
{
total+=countOneNum(i);
}
return total;
}
int main(int argc, const char * argv[])
{
int n=12;
cout<<countOneNumSum(n)<<endl;
getchar();
return 0;
}
对于数abcde,c这位出现1的次数分以下情况;
1.若c>1,结论是(ab+1)*100
2.若c==1,结论是(ab)*100+de+1;
3.若c<1,结轮是 ab*100+de+1
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int getPreInt(int n,int val) { while(val>10) { n/=10; val/=10; } return n/10; } int getCurInt(int n,int val) { while(val>10) { n/=10; val/=10; } return n%10; } int getPosInt(int n,int val) { return n%(val/10); } int countOneNum(int n) { int ret=0; int val=10; while(val<n*10) { int cur=getCurInt(n,val); int pre=getPreInt(n,val); int pos=getPosInt(n,val); if(cur==0) { ret+=pre*val/10; }else if(cur==1) { ret+=pre*val/10+pos+1; }else { ret+=(pre+1)*val/10; } val*=10; } return ret; } int main(int argc, const char * argv[]) { int n=123; cout<<countOneNum(n)<<endl; getchar(); return 0; }
原文:http://blog.csdn.net/richard_rufeng/article/details/19327027