1. 程式人生 > >劍指offer(31)—整數1出現的次數

劍指offer(31)—整數1出現的次數

題目描述

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。

思路

1、暴力求解法:依次求出1~n的每個數中所含的1的個數,通過對10取餘判斷個位數是否為1來計算;
2、分析資料找規律,舉例分析,以21345為例。

程式碼

class Solution {
public:
    int PowBase10(int n){   //10^n
        int res = 1
; for(int i = 0; i < n; i++) res *= 10; return res; } int NumOf1(char *str){ if(!str || *str<'0' || *str>'9' || *str=='\0') //特殊情況處理 return 0; int first = *str-'0'; int len = strlen(str); if(len==1 && first ==0) //0
return 0; if(len==1 && first > 0) //1~9 return 1; int numFirstDigit = 0; //第一位中1的數目 if(first > 1) numFirstDigit = PowBase10(len - 1); else if(first == 1) numFirstDigit = atoi(str+1) + 1; int numOtherDigits = 0
; //其他位中1的數目 numOtherDigits = PowBase10(len-2) * first * (len - 1); int numRecursive = NumOf1(str+1); return numFirstDigit + numOtherDigits + numRecursive; } int NumberOf1Between1AndN_Solution(int n) { if(n<=0) return 0; char str[50]; sprintf(str,"%d",n); return NumOf1(str); } };