求1~n 中数字出现的次数,如1-852 中1出现的次数,符合条件的有,1,,1,1,12,13,14,。。。。。。参考《编程之美》,略有修改,扩展到可以求任意数字出现的次数,也可以求出现0的次数。
直接上代码:
#include <iostream>
using namespace std;
const int needCountNum=9;
int countNum1(int num){
<span style="white-space:pre"> </span>int count1=0;
<span style="white-space:pre"> </span>int highNum=0,curNum=0,lowNum=0;
<span style="white-space:pre"> </span>int factor=1;
<span style="white-space:pre"> </span>while(num/factor!=0){
lowNum=num-(num/factor)*factor;// 取得curNum的后面数字
curNum=(num/factor)%10;//取得当前的位
highNum=num/(10*factor);
if (curNum<needCountNum)
{
count1+=highNum*factor;
}
else if(curNum==needCountNum){
count1+=highNum*factor+lowNum+1;//
}
else{
count1+=(highNum+1)*factor;
}
factor*=10;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return count1;
}
int main(){
std::cout<<countNum1(9258);
return 0;
}
把<pre name="code" class="html">needCountNum修改为你需要的数字即可。
下面写查找0的次数,这个比较特别,稍微修改一下就可以了。
<pre name="code" class="cpp">#include <iostream>
using namespace std;
const int needCountNum=0;
int countNum1(int num){
int count1=0;
int highNum=0,curNum=0,lowNum=0;
int factor=1;
while(num/factor!=0){
lowNum=num-(num/factor)*factor;// 取得curNum的后面数字
curNum=(num/factor)%10;//取得当前的位
highNum=num/(10*factor);
if (curNum==needCountNum)
{
count1+=highNum*factor+lowNum+1;
}
else{
count1+=(highNum)*factor;
}
factor*=10;
}
return count1;
}
int main(){
std::cout<<countNum1(2);
return 0;
}