您的位置:首页 > 其它

51Nod 数字0到9的数量 (数位DP)

2017-06-06 21:44 489 查看
跟1009题类似:

http://blog.csdn.net/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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp