• 统计数字问题


    统计数字问题


    Time limit: 1000MS    Memory limit: 32768K
    Total Submit: 617    Accepted: 135

    一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,
    每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数
    字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,
    2,…,9。

    给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。计算书的全部页码中分别用到多少
    次数字0,1,2,…,9。

    每个文件只有1 行,给出表示书的总页码的整数n。

    输出文件共有10行,在第k行输出页码中用到数
    字k-1 的次数,k=1,2,…,10。

    Sample Input

    11

    Sample Output

    1
    4
    1
    1
    1
    1
    1
    1
    1
    1

    代码
    1
    2
    3 #include<stdio.h>
    4 #include<string.h>
    5  constint N =10;
    6 int ans[N]; //ans[i]存放数字i出现的次数
    7 char str[N]; //输入的数字
    8 int a[N],len; //a[i]为10^i,len为数字的长度
    9
    10 void solve(long n) //统计数字n
    11 {
    12 long m=n+1;
    13 memset(ans,0,sizeof(ans));
    14 int j,i;
    15 for(i=0;i<len;i++)
    16 {
    17 int x=str[i]-'0';
    18 int t=(m-1)/a[len-i-1];
    19 ans[x]+=m-t*a[len-i-1];//自左往右到i位数字不变条件下,i位为x的数字个数
    20 t=t/10;
    21 j=0;
    22 while(j<x)
    23 {
    24 ans[j]+=(t+1)*a[len-i-1];//统计当前位置为j出现的个数
    25 j++;
    26 }
    27 while(j<N) //统计当前位置为j的数目
    28 {
    29 ans[j]+=t*a[len-i-1];
    30 j++;
    31 }
    32 ans[0]-=a[len-i-1];//消去前导0
    33 }
    34 for(i=0;i<N;i++)
    35 printf("%d\n",ans[i]);
    36 }
    37
    38 int main()
    39 {
    40 int i;
    41 a[0]=1;
    42 for(i=1;i<N;i++)
    43 a[i]=a[i-1]*10;
    44 long n;
    45 while(scanf("%s",str)!=EOF)
    46 {
    47 n=0;
    48 len=strlen(str);
    49 for(int i=0;i<len;i++)
    50 n=n*10+str[i]-'0';
    51 solve(n);
    52 }
    53 return0;
    54 }
  • 相关阅读:
    装饰器
    函数的初识
    python的文件操作
    深浅copy
    set集合,是一个无序且不重复的元素集合
    基础数据类型 :字典
    列表的增删改查
    易错点 默认参数陷阱
    js中Array对象常用方法
    printf用法demo
  • 原文地址:https://www.cnblogs.com/AndreMouche/p/1922830.html
Copyright © 2020-2023  润新知