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

题目描述:

求出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;
	else
		numFirstDigit=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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值