在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
题目:输入一个整数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;
}