给定一个正整数N,从1到N所有整数,计算出现1的个数
最简单方法是计算每个数中1的个数然后相加,但是这么做效率随着数字增大超线性增长。
f(N)为要求值,N为正整数。
改进方法 规律分析:计算f(N)转换到计算N每一位出现1的个数,这种情况最大好处就是避免了重复计算个数问题。
举例子说明:
如果百位为0 ,百位上出现1的个数有其高位决定,12013 百位出现1 情况 100-199 ,1100-1199,2100-2199 ......11100-11199 共1200个 。也就是高位12决定,即为 12*100(百位)。
如果为百位为1 ,百位出现1次数不仅由高位决定也由低位影响。12113 除了像上面那样高位分析外还增加低位 12100-121113 共 低位数字+1个。
数字为2-9 为高位数+1再乘以当前位数。
#include <iostream>
using namespace std;
long SumofOne(long num)
{
long count=0;
long factor=1;
long lownum=0,currentnum=0,highnum=0;
while (num/factor!=0)
{
highnum=num/(factor*10);
currentnum=(num/factor)%10;
lownum=num-(num/factor)*factor;
switch(currentnum){
case 0:
count+=highnum*factor;
break;
case 1:
count+=highnum*factor+lownum+1;
break;
default:
count+=(highnum+1)*factor;
break;
}
factor=factor*10;
}
return count;
}
int main()
{
long num=10000;
cout<<"包含1的数目为:"<<SumofOne(num)<<endl;
return 0;
}