跟1009题类似:
http://blog.youkuaiyun.com/since_natural_ran/article/details/72668443
但是还是这道题考察能力强。
对于数字的考察有时候要多多注意规律,比如之前求1的数量的时候只是考虑了1,而其它的数字有时候和1有不同的情况,比如0.
按照其它的数字算的话总是0能多算一个dp[len-1]所以要减去。
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL n,m;
LL dp[20];
void init()
{
memset(dp,0,sizeof(dp));
for(int i = 1;i < 20; i++) {
dp[i] = dp[i-1]*10 + pow(10,i-1);
}
}
LL solve(LL x,int nu)
{
LL temp = x;
LL ans = 0;
LL tail = 0;
LL tenn = 1;
int digit = 0;
int len = 0;
while(x) {
digit = x%10;
x /= 10;
len++;
if(digit > nu) {
ans += tenn + digit*dp[len-1];
}
else if(digit == nu) {
ans += tail + 1 + digit*dp[len-1];
}
else {
ans += digit*dp[len-1];
}
tail = tail + digit*tenn;
tenn *= 10;
}
if(nu == 0) {
LL t = 1;
while(temp) {
ans -= t;
t *= 10;
temp /= 10;
}
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
init();
scanf("%I64d%I64d",&n,&m);
for(int i = 0;i <= 9; i++) {
printf("%I64d\n",solve(m,i)-solve(n-1,i));
}
return 0;
}
数字出现次数算法解析
本文介绍了一种计算从1到给定数字范围内每个数字0-9出现次数的算法。通过动态规划预先计算部分结果,并利用递归思想解决不同位数的情况。文章提供了完整的C++实现代码,展示了如何根据不同数字的特点进行优化,特别关注0和1的特殊情况。
6130

被折叠的 条评论
为什么被折叠?



