编程语言
首页 > 编程语言> > 算法 数字统计问题

算法 数字统计问题

作者:互联网

问题描述

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

解法一:

这种算法就是老老实实的设置每一个数的计数器,然后如果相等,计数器就加一。

#include<stdio.h>
void number(int n){
    int count1=0,count2=0,count3=0,count4=0,count5=0,count6=0,count7=0,count8=0,count9=0,count0=0;
    for(int i=1;i<=n;i++){
        int m=i;
        while(m){
            int j=m%10;
            if(j==1){
                count1++;
            } 
            else if(j==2){
                count2++;
            }
            else if(j==3){
                count3++;
            }
            else if(j==4){
                count4++;
            }
            else if(j==5){
                count5++;
            }
            else if(j==6){
                count6++;
            }
            else if(j==7){
                count7++;
            }
            else if(j==8){
                count8++;
            }
            else if(j==9){
                count9++;
            }
            else{
                count0++;
            }
            m=m/10;
        }
    }
    printf("The result is\n");
    printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",count0,count1,count2,count3,count4,count5,count6,count7,count8,count9);
}
int main(){
    printf("Please input the pagecount");
    int n;
    scanf("%d",&n);
    printf("%d\n",n);
    number(n);
} 

解法二:

解法二就比较巧妙,发现得出的每一位数其实可以看成数组的角标,而数组里面的每一位数即为0-9出现次数的计数器

#include<stdio.h>
void number(int n){
    int arr[10]={0};
    for(int i=1;i<=n;i++){
        int m=i;
        while(m!=0){
            int j=m%10;
            arr[j]++;
            m=m/10;
        }
    }
    printf("The result is\n");
    for(int i=0;i<10;i++){
        printf("%d\n",arr[i]);
    }
}
int main(){
    printf("Please input the pagecount\n");
    int n;
    scanf("%d",&n);
    printf("%d\n",n);
    number(n);
}

 

标签:数字,int,计数器,算法,一位数,解法,页码,统计
来源: https://www.cnblogs.com/Celiachen/p/14714482.html