题目:输入一个数N,求出1~N中包含1的个数的总和(时间复杂度控制在O(logn))
思想:
按每一位,考虑1出现的情况,找出递推式
代码展示:
#include<stdio.h>
int main(){
int n=1034;
int k,q,s=0,t=1;
int l=1;
q=n;
while(l>0)
{
l=n/10;
k=n%10;
if (k==0) //第一种取到位为0,比如201中的第二位0,代表在十位中只有2个0到9有1
s=s+l*t;
else if (k==1)//第二种取到1,比如211中的第二位,代表在十位中除了2个0到9之外,还有多余的1
{s=s+l*t+q%t+1;}
else
{s=s+(l+1)*t;}//第三种大于1,比如222中的第二位,代表在十位中只有3个0到9有1
t=t*10;
n=l;
}
printf("1的个数为%d\n",s);
}