剣はオファー43を指します。1〜nの整数での1の出現数

整数nを入力し、1からnまでのn個の整数の10進表現で1の出現回数を見つけます。

たとえば、12と入力すると、1から12までの整数に1を含む数字は、1、10、11、および12であり、1は合計5回表示されます。

例1:

入力:n = 12
出力:5

例2:

入力:n = 13
出力:6

制限:

1 <= n < 2^31

1の出現回数なので、0〜nに分解でき、各桁に1がいくつあるので、分解を
続けます。たとえば、109です。1
桁の場合:
前のサイクルは0〜に似ています。 407、毎回0〜9が表示されます。1この1なので、合計407 * 1 + 0〜9、つまり408です。

十の位の場合:
前のサイクルで40回、毎回0〜100、次に十の位の場合、10回、
40 * 10 + 0 = 400

百の位の場合:1ビットの特別である、それは1であるため、低い桁もカウントしなければならないので、実施例14については、それは0である。10 + 4 + 1
5
100 + 09 + = 510 1

したがって、ルールが作成され
ます。現在の位置がa、低い位置がb、高い位置がcであるとします。

a=0   当前位贡献: c*位数(个位就是1,十位10,百位100)

a=1   当前位贡献:c*位数+b+1

a>1   当前位贡献:c*位数+位数
class Solution {
    
    
public:
    int countDigitOne(int n) {
    
    
        long sum=0;
        int b=0;
        for(long i=1;n!=0;i*=10)
        {
    
    
            int a=n%10;
            int c=n/10;
            if(a==0)
            {
    
    
                sum+=c*i;
            }
            else if(a==1)
            {
    
    
                sum+=c*i+b+1;
            }
            else
            {
    
    
                sum+=c*i+i;
            }
            b=b+a*i;
            n/=10;
        }
        return sum;

    }
};

おすすめ

転載: blog.csdn.net/qq_43624038/article/details/113601803