您的位置:首页 > 职场人生

面试题32:从1到n整数中1出现的次数

2013-07-18 13:09 197 查看
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12共4次。

1,不考虑时间效率的方法,每浏览一个数,判断每一位是不是含1.时间复杂度:位数O(logn),数n,总:O(n*logn)

2,根据数学规律:排列组合

对1000:

最高位:0,3*10*10-2种

                1::1*(0+1)*(0+1)*(0+1)

1234:

最高位:0,3*10*10-2种

                1::1*(2+1)*(3+1)*(4+1)

3124:

最高位:0,2:2*(3*10*10-2)种

                1::1000

3:f(124)

源代码:
#include "stdio.h"
int caliq(int i,int q)
{
return i*q/10-(i-1);
}
int f(int data)
{
if(data == 0)
return 0;
if(data>=1 && data<10)
return 1;
int high=data;
int q=1,i=0;
int s1=1;
while(high/10)
{
i++;
q=q*10;
int temp=high%10;
high=high/10;
s1=s1*(temp+1);
}
//printf("i:%d;q:%d;high:%d",i,q,high);
if(data>=q && data<2*q)
{
//printf("last:%d\n",caliq(i,q)+s1);
return caliq(i,q)+s1;
}
else
{
return (high-1)*caliq(i,q)+q+f(data-high*q);
};
}
void main()
{
int a=3125;
//int a=21345;
int result=f(a);
printf("result:%d",result);
}

结果:
result:1633Press any key to continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: