编程之美-----1的数目
/*编程之美系列:*/ //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; }