算法习题30:在从1到n的正数中1出现的次数

在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。

分析:这是一道广为流传的google面试题

----------------------------------------------------------

这道题大家都想得到用遍历的方式来获得结果,就是从1-n的数字全部判断一遍,看看每个数字含有几个1,然后记录下来即可(见Count1()函数)

我后来看了别人的解法,确实挺巧妙的,利用高低位的规律实现了快速的计算出结果

转自:http://blog.csdn.net/zz198808/article/details/7588335

大家可以参看上面博客使用的方法


//============================================================================
// Name        : Count1.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

int Count1(int n);
int Count1_2( int n );

int main() {
	int input = 0;
	cin>>input;
	cout<<Count1(input);
	//cout<<Count1_2(input);
	return 0;
}

int Count1(int n){
	int i = 1;
	int count = 0;
	for(;i<=n;i++){
		int cur = i;
		while(cur>9){
			int temp = cur%10;
			if(temp == 1){
				count++;
			}
			cur = cur/10;
		}
		if(cur == 1){
			count++;
		}
	}
	return count;
}


// 参见http://blog.csdn.net/zz198808/article/details/7588335
int Count1_2( int n )
{
	int iCount = 0;
	int iFactor = 1;

	int iLowerNum = 0;
	int iCurrNum = 0;
	int iHigherNum = 0;

	while( n / iFactor != 0 )
	{
		iLowerNum = n - ( n / iFactor ) * iFactor;
		iCurrNum = (n / iFactor ) % 10;
		iHigherNum = n / ( iFactor *10 );

		switch( iCurrNum )
		{
		case 0:
			iCount += iHigherNum * iFactor;
			break;
		case 1:
			iCount += iHigherNum * iFactor + iLowerNum + 1;
			break;
		default:
			iCount += ( iHigherNum + 1 ) * iFactor;
			break;
		}

		iFactor *= 10;
	}
	return iCount;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值