这个问题关键在于好好分析一些样例如:
给定123这个数,你说这个从1到123所有数字中,1出现的次数是多少?
首先我们要分析个位上1出现的次数,我们看看什么情况下个位出现1:
1,11,21,31,41,-----91,101,111,121,
因为从1-123中其实就是有多少个十就行了。
你看下从1到100个位出现1的情况:
1,11,21,31,41,51,------91。有多少个呢?
就是10*1=10个
其实就是从01,11,21,31,41,51-----91当然是10了。
就是1-100中个位有10个1.
然后再从101-123呢个位有多少个1?
就是101,111,121,有(2+1)*1=3个。
其实我们可以这样了。
那么再分析十位上出现1的情况:
1-123.
则有10-19 110-119
有多少个呢?
首先看1-100有
10-19 有10个
然后110-119 有10个
则有(1+1)*10=20个
为什么是1+1?
其实和123中10位数字有关,你想如果是103呢十位有多少个1?
就是1*10=10个
113呢?
就是1*10+3=13.
123呢?
2>1呢
(1+1)*10=20了。
于是就有规律了。
源代码:
#ifndef NUMBER_OFONEINDATA_H
#define NUMBER_OFONEINDATA_H
#include<iostream>
unsigned int numberOfOneInData(unsigned int v_data){
if(v_data<=0){
return 0;
}
unsigned int oneCount=0;
unsigned int iFactor=1;
unsigned int icurrentUnitNum=0;
unsigned int iLowerNum=0;
unsigned int iHigherNum=0;
while(v_data/iFactor!=0){
iLowerNum=v_data-(v_data/iFactor)*iFactor;
icurrentUnitNum=(v_data/iFactor)%10;
iHigherNum=v_data/(iFactor*10);
switch (icurrentUnitNum)
{
case 0:
oneCount+=iHigherNum*iFactor;
break;
case 1:
oneCount+=iHigherNum*iFactor+iLowerNum+1;
break;
default:
oneCount+=(iHigherNum+1)*iFactor;
break;
}
iFactor=iFactor*10;
}
return oneCount;
}
#endif