天天看點

找“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;
}
      

  

截圖:

找“1”問題

總結:

 一些題目總存在一些的規律,我們在遇到問題時應多多總結尋找題目中的規律,多列舉一些有代表的數從中找到規律在推廣到一般,解決問題。