/*编程之美系列:*/
//01 一的数目:
#include<iostream>
using namespace std;
//暴力:
/*
int f(int n)
{
int count=0;
while(n)
{
if(n%10==1)
{ count++; }
n/=10;
}
return count;
}
*/
//数学思想
/*
假设N=abcde为一个整数,a,b,c,d,e分别对应十进制数,如果要计算(1到N)百位出现1的个数,他将受三个因素的影响:百位以上的数,百位数和百位一下的数,具体依赖如下:
分别设整数N百位以上,百位和百位一下的数字分别为:preNum,curNum,proNum,如N=abcde的三个值分别为:
preNum=ab
curNum=c
proNum=de
分三种情况讨论百位上的数字出现1的计数(用oneCount表示)
情况1:百位数字为0(curNum=0),oneCount=preNum*100;
情况2:百位数字为1(curNum=1),oneCount=preNum*100+proNum+1;
情况3:百位数字大于1(curNum>1),oneCount=(preNum+1)*100;
其他位计算1出现的个数类似
* 对于数abcde,c这位出现1的次数分以下情况:
* 1.若c > 1,结论是(ab + 1)* 100;
* 2.若c == 1,结论是(ab)* 100 + de + 1;
* 3.若c < 1,结轮是 ab * 100 + de + 1;
*/
int f (int n)
{
int count=0;
int t=1;
int pre,cur,aft;
while(n/t)
{
pre=(n/t)/10;//当前数的高位部分
cur=(n/t)%10;
aft=n%t;//当前数的低位部分
switch(cur){
case(0):
count+=pre*t;
break;
case(1):
count+=pre*t+aft+1;
break;
default:
count+=(pre+1)*t;
break;
}
t*=10;
}
return count;
}
int main(){
cout<<"请输入整数n:"<<endl;
int n;
cin>>n;
cout<<f(n)<<endl;
system("pause");
return 0;
}