1-1统计数字问题(C语言实现)

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

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//统计书页的为数
int Getlen(int n)
{
    int i,len=0;
    for(i=0; n>0; i++)
    {
        n/=10;
        len++;
    }
    return len;

}
//计数,统计0-9出现的次数
void Count(int n ,int A[10])
{
    int len,len2,p,h,rest,i;
    len=Getlen(n);
    p=n/(int)pow(10,len-1);
    for(i=0; i<10; i++)
    {
        A[i]=A[i]+p*(len-1)*pow(10,len-2);
    }
    for(i=0; i<p; i++)
    {
        A[i]+=pow(10,len-1);
    }
    h=p;//h是最高位上的数字
    rest=n%(int)pow(10,len-1);
    len2=Getlen(rest);
    if(rest==0)
    {
        A[h]++;
        A[0]+=len-1;
        return ;
    }
    if(len2!=len-1)
        A[0]+=(len-len2-1)*(rest+1);
    A[h]+=1+rest;
    return Count(rest,A);

}
int main()
{
    int n,A[10]={0},i,len;
    scanf("%d",&n);
    len=Getlen(n);
    Count(n,A);
    //减去多余的前导0
    for(i=0; i<len; i++)
        A[0]-=pow(10,i);
    for(i=0; i<10; i++)
        printf("%d\n",A[i]);

}

借鉴了这篇博客,大佬果然厉害!!!(27条消息) 1-1统计数字问题(详解)_努力写题的tyf的博客-CSDN博客_统计数字问题

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值