计算前N个数字钟1的个数(编程之美2.4 1的数目)

来源:互联网 发布:黄光剑抄袭软件 编辑:程序博客网 时间:2024/05/18 03:11
#include "point.h"using namespace std;int CalcOneHelp(int);int CalcOne(int);int power(int ,int);int CalcOne(int N)//穷举法,比较傻瓜,思路简单,运算速度慢{int sum=0;for(int i=1;i<=N;i++)sum+=CalcOneHelp(i);return sum;}int CalcTwo(int N)//新算法,需要进行一些数学分析,运算速度快{int e=0;//这事10的指数int sum=0;int numlater=0;//当前数字后面的数字,如12345;如果当前数字为2(千位),那么numlater为345while(N>0){int obj=N%10;//当前该位的数字int numpre=N/10;//当前这个数字前面的数字,如712345;如果当前数字为2(千位),那么numpre为71if(0==obj)sum+=numpre*power(10,e);else if(1<obj)sum+=(numpre+1)*power(10,e);else//为1sum+=(numpre*power(10,e))+numlater;//计算完毕,还要做3件事情numlater+=obj*power(10,e);e++;N=numpre;}return sum;}void main(){int N;while(true){cin>>N;int rst1=CalcOne(N);//alg 1int rst2=CalcTwo(N);//alg 2cout<<rst1<<endl;cout<<rst1<<endl;}}int CalcOneHelp(int T){int mysum=0;while(T>0){int rem=T%10;if(rem==1)mysum++;T=T/10;}return mysum;}int power(int b,int e){int rst=1;for(int i=0;i<e;i++)rst*=b;return rst;}

原创粉丝点击