題目:
給定一個十進制的正整數,寫下從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;
}
截圖:

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