计算从1到整数N之间的所有整数,1出现的次数。记为f(N).
比如12:1,10,11,12 1出现5次。
【思路】
1.常规解法,先计算任意一个整数N中所含的1的个数,比如13含1个1,然后再套一个从1到N的循环,计算每个数出现1的次数。
2.总结规律。
f(N)=个位出现1的个数+十位出现1的个数+百位出现1的个数+.....
eg:N=123;
个位出现1的次数与十位数的关系:
个位数字=0:十位数(的个数)
个位数字>=1:十位数+1
十位出现1的次数与个位数的关系:
十位数字=1:个位数+1
十位数字>1:(百位数+1)*10
总结:每位上出现1的次数会受到三个因素影响:该位上的数字、该位以下(低位)上的数字、该位以上(高位)上的数字。
【code in the book】
int count1inInteger(int n) { int icount=0; int ilower=0; int icurr=0; int ihigher=0; int ifactor=1; while(n/ifactor!=0){ ilower=n-(n/ifactor)*ifactor; icurr=(n/ifactor)%10; ihigher=n/(ifactor*10); switch(icurr){ case 0: icount+=ihigher*ifactor; break; case 1: icount+=ihigher*ifactor+ilower+1; break; default: icount+=(ihigher+1)*ifactor; break; } ifactor*=10; } return icount; }
【总结】
算法很棒,但规律难发现,更难整合到几行代码中。