码迷,mamicode.com
首页 > 其他好文 > 详细

51Nod1009

时间:2018-03-11 14:30:53      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:次方   markdown   char   pre   for   计算   数位dp   long   include   

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5

一道数位DP的裸题。。

#include<cstdio>
#include<cstring>
typedef long long LL;
LL table[15];//table[n]表示10^n-1的数下有几个1

void init(){
    int cache=1;
    for(int i=2;i<=9;i++) table[i]=table[i-1]*10+(cache=cache*10);
}//直接离线处理打表,也可以用记忆化搜索实现

int pp(int a){
    int b=1;
    for(int i=1;i<=a;i++) b*=10;
    return b;
}//用来做10的次方的

LL solve(int a){
    char cache[20];
    if(a==0) return 0;
    if(a/10==0) return 1;
    sprintf(cache,"%d",a);
    int longn=strlen(cache);
    --longn;
    LL ans=(cache[0]-‘0‘)*table[longn];
    if(cache[0]==‘1‘) ans+=a%pp(longn)+1;
    else ans+=pp(longn);
    ans+=solve(a%pp(longn));
    return ans;
}

int main(){
    int n;
    table[1]=1;
    init();
    scanf("%d",&n); 
    printf("%d",solve(n));
}

51Nod1009

标签:次方   markdown   char   pre   for   计算   数位dp   long   include   

原文地址:https://www.cnblogs.com/jiaangk/p/8543458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!