1到N中1出现的次数

it2026-01-04  9

这个问题关键在于好好分析一些样例如: 给定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

最新回复(0)