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

劍指offer—整數中1出現的次數

華電北風吹
天津大學認知計算與應用重點實驗室
日期:2015/10/5

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

解析:最簡單的辦法一個一個數。高階的辦法
一個一個數的數

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        int
result=0; for(int i=1;i<=n;i++) result+=count1(i); return result; } int count1(int n) { int result=0; while(n>0) { if(n%10==1) result++; n=n/10; } return result; } };

找規律高效演算法

class Solution
 {
public:
    int NumberOf1Between1AndN_Solution(int n){ 
        int ones = 0;
        for (long long m = 1; m <= n; m *= 10)
            ones += (n/m + 8) / 10 * m + (n/m % 10 == 1) * (n%m + 1);
         return ones;

    }
};

自己寫的一個比較容易理解的程式碼

class Solution
{
public:
    int NumberOf1Between1AndN_Solution
(int n) { int ones = 0; for (int m = 1; m <= n; m *= 10) { int bitNum=(n/m)%10; int a=((n/m/10)+(bitNum>1))*m; int b=(bitNum==1)*(n%m+1); ones += a + b; } return ones; } };