从1到n整数中1出现的次数

来源:互联网 发布:怎么用php做菱形 编辑:程序博客网 时间:2024/04/30 11:42

题目描述:

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。具体分析 参照《剑指offer》

代码实现:

#include <iostream>#include <math.h>using namespace std;int NumberOf1(const char* strN){if(!strN || *strN<'0' || *strN>'9' || *strN=='\0')return 0;int first = *strN-'0';//first输入数字的第一位int len = strlen(strN);if(first==0 && first==1)return 0;if(len==1 && first>0)return 1;//假设strN是“21345”//numFirstDigit是数字10000-19999的第一位中的数目int numFirstDigit = 0;if(first==1)numFirstDigit=atoi(strN+1)+1;elsenumFirstDigit=pow(10,len-1);//numOtherDigit是1346-21345除了第一位之外的数位中数目int numOtherDigits=first*(len-1)*pow(10,len-2);cout<<"dangqian :"<<first<<"   "<<len<<endl;//numRecursive是1-1345中的数目int numRecursive=NumberOf1(strN+1);cout<<"   numFirstDigit :"<<numFirstDigit<<"     numOtherDigits: "<<numOtherDigits<<endl;return numFirstDigit+numOtherDigits+numRecursive;}int NumberOf1Between1AndN(int n){if(n <= 0 )return 0;char strN[50];sprintf(strN,"%d", n);return NumberOf1(strN);}void main(){cout<<NumberOf1Between1AndN(21345)<<endl;}



0 0
原创粉丝点击