找“1”问题

题目:

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。
    2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
思路:
 这道题目存在者一些规律:
    f(0)=0;f(1)=1;f(2-9)=1;
    f(10)=1+(0+1)=2;
    f(11)=(1+1)+(1+1)=4;
    f(13)=(1+1)+(3+1)=6;
    f(23)=(2+1)+10=13;
    f(33)=(3+1)+10=14;
    f(93)=(9+1)+10=20;
    f(123)=个位出现的1数+十位出现的1数+百位出现的1数
当N = abcde时
    以c位为例
    if(c==0)  num=ab*100;
    if(c==1)  num=ab*100+de+1;
    if(c>1)  num=(ab+1)*100
代码:
#include <iostream>
using namespace std;
int main()
{
	int n;
	cout<<"请输入数字:";
	cin>>n;
	int count=0; 
	int factor=1; 
	int LowerNum=0;
	int CurNum=0;
	int HigherNum=0;
	while (n/factor!=0)       
	{
		LowerNum=n-(n/factor)*factor;
		CurNum=(n/factor)%10;
		HigherNum=n/(factor*10);
		if(CurNum==0)		
			count=count+HigherNum*factor;			
		if(CurNum==1)
			count=count+HigherNum*factor + LowerNum +1;
		if(CurNum>1)
			count=count+(HigherNum+1)*factor;
		factor=factor*10;
	}
	cout<<"出现数字1的个数为:"<<count<<endl;
	return 0;
}

  

 

  

截图:
 
总结:
 一些题目总存在一些的规律,我们在遇到问题时应多多总结寻找题目中的规律,多列举一些有代表的数从中找到规律在推广到一般,解决问题。
 
原文地址:https://www.cnblogs.com/lingxi/p/4549564.html