整数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;
}
};