输入一个[0-9]之间的数字m,统计出从1开始到正整数n中的数字的序列里,一共出现多少次这个数字。
基本思路
考虑在十进制下,n的每一位可能出现多少次m。
举个例子:
若要求1到153中出现多少次2,153/10=15,说明当个位为2时,至少由15数处在这个范围内,002,012,022,032...,142
为什么说时至少呢?因为2<3,即152也处在这个范围内,所以个位数一共出现16次2。
百位,千位同理。
参考代码
def ff(x, num):
m, ans = 1, 0
while x // m > 0:
h, mod = divmod(x, m * 10)
cur, l = divmod(mod, m)
if cur > num:
ans += h * m + m
elif cur == num:
ans += h * m + l + 1
else:
ans += h * m
m *= 10
return ans
int f(int n, int m)
{
int ans = 0;
int base = 1;
while (n / base)
{
int h = n / (base * 10);
int mod = n % (base * 10);
int l = mod / base;
int res = mod % base;
//将数字拆成3部分,h表示左边的部分,l表示枚举到的那一位(中间那部分),res表示右边剩下的那部分
if (l > m)
ans += h * base + base;
else if (l == m)
ans += h * base + res + 1;
else
ans += h * base;
base *= 10;
}
return ans;
}
标签:10,正整数,计算,int,num,给定,base,ans,mod
From: https://www.cnblogs.com/hetailang/p/16897505.html