51nod数字1的数量

这道题瞎jbyy了很久 方法可能很奇怪...

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
int n,ans;
int f[35][10],w[11];
void init(){
    w[1]=1;
    for(int i=2;i<=10;i++) w[i]=w[i-1]*10;
    f[1][1]=1;
    for(int i=2;i<=10;i++)
     for(int j=0;j<=9;j++){
      for(int k=0;k<=9;k++)f[i][j]+=f[i-1][k];
      if(j==1) f[i][j]+=w[i];
     }
    //for(int i=1;i<=10;i++,printf("\n")) for(int j=0;j<=9;j++) printf("%d ",f[i][j]);
}
int main()
{
    init();
    int sum=10,ans=0,v,k,tot=2;
    scanf("%d",&n); k=n;
    while(w[sum]>n) sum--;
    int now=n/w[sum];  
    for(int i=0;i<now;i++) ans+=f[sum][i];
    n=n%w[sum];
    for(int i=sum-1;i;i--){
        v=n/w[i];
        for(int j=0;j<v;j++) ans+=f[i][j]; 
        n=n%w[i]; 
    }
    v=k;
    if(k%10==1) ans++;
    v=v/10;
    while(tot<=sum){
        if(v%10==1) ans=ans+k%w[tot]+1;
        tot++; v=v/10;
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

posted @ 2017-06-19 19:04  友人Aqwq  阅读(161)  评论(0编辑  收藏  举报