这个问题关键在于好好分析一些样例如:
给定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
来自为知笔记(Wiz)
转载于:https://www.cnblogs.com/yml435/p/4655474.html