美文网首页
计算页码各个数字出现的次数

计算页码各个数字出现的次数

作者: Xeon_CC | 来源:发表于2019-06-16 20:15 被阅读0次

    计算页码各个数字出现的次数

    方法一:笨方法实现

    #include<iostream>
    using namespace std;
    int get_length(int x);
    long x;
    int i;
     
    int main() {
        cin >> x;
        int static count[10];
        for (int i = 0;i <= 9;i++) {
            count[i] = 0;
        }
        for (i = 1;i <= x;i++) {
            if (get_length(i) == 1) {
                count[i]++;
            }
     
            if (get_length(i) == 2) {
                count[i % 10]++;
                count[i / 10]++;
            }
     
            if(get_length(i)==3){
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[i / 100]++;
            }
     
            if (get_length(i)==4) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[i / 1000]++;
            }
     
            if (get_length(i)==5) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[(i % 10000) / 1000]++;
                count[i / 10000]++;
            }
     
            if (get_length(i) == 6) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[(i % 10000) / 1000]++;
                count[(i % 100000) / 10000]++;
                count[i / 100000]++;
            }
     
            if (get_length(i) == 7) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[(i % 10000) / 1000]++;
                count[(i % 100000) / 10000]++;
                count[(i % 1000000) / 100000]++;
                count[i / 1000000]++;
            }
     
            if (get_length(i)==8) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[(i % 10000) / 1000]++;
                count[(i % 100000) / 10000]++;
                count[(i % 1000000) / 100000]++;
                count[(i % 10000000) / 1000000]++;
                count[i / 10000000]++;
            }
            
            if (get_length(i) == 9) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[(i % 10000) / 1000]++;
                count[(i % 100000) / 10000]++;
                count[(i % 1000000) / 100000]++;
                count[(i % 10000000) / 1000000]++;
                count[(i % 100000000) / 10000000]++;
                count[i / 100000000]++;
            }
     
            if (get_length(i) == 10) {
                count[i % 10]++;
                count[(i % 100) / 10]++;
                count[(i % 1000) / 100]++;
                count[(i % 10000) / 1000]++;
                count[(i % 100000) / 10000]++;
                count[(i % 1000000) / 100000]++;
                count[(i % 10000000) / 1000000]++;
                count[(i % 100000000) / 10000000]++;
                count[(i % 1000000000) / 100000000]++;
                count[i / 1000000000]++;
            }
        }
        for (int i = 0;i <= 9;i++) {
            cout << count[i] << "   ";
        }
        
    }   
     
     
    int get_length(int x){
        using namespace std;
        int leng = 0;
        while (x){
            x =x / 10;
            leng++;
        }
        return leng;
    }
    
    

    方法二:通过较好的算法实现

    #include<iostream>
    using namespace std;
    int f(int n);
    int s(int n);
    int get_length(int x);
    int get_nozero_lenth(int x);
    int x;
    int _x;
     
    int main() {
        for (;;) {
            cout << "输入页码(按0结束):";
            cin >> x;
            if (x == 0||x<0) {
                exit(0);
            }
     
            _x = x;
            int c[10];
            for (int i = 0;i <= 9;i++) {
                c[i] = 0;
            }
            //假设输入的数字为400321
            for (int j = 0;j < get_nozero_lenth(x);j++) {
                //获取最高的位数字a
                int a = _x / pow(10, (get_length(_x) - 1));
                //假设输入的数是6位数,那么从000000开始算到输入的数字x
                //获取000000~099999 中,后5位数中0~9出现的次数 b
                int b = f(get_length(_x) - 1);
                //a为最高位,等于0~3 的个数,a*b 的值就是000000~399999 中,后5位里面0~9 出现的次数,最高位还没有计算
                for (int i = 0;i <= 9;i++) {
                    c[i] = c[i] + a*b;
                }
     
                //获取输入_x的长度 , 第一次循环 _x==400321 ,第二次循环_x==321 第3次循环 _x==21 ,以此类推
                int len = get_length(_x);
                //获取最高位m
                int m = _x / (pow(10, len - 1));
                //在最高位继续获取 0~(m-1) 出现的次数 , 例如 000000~099999 仅仅在最高位中0出现的次数就有100000次,100000~199999,以此类推
                for (int i = 0;i < m;i++) {
                    c[i] = c[i] + pow(10, len - 1);
                }
     
                //以下3行代码,获取除最高位以外剩下的数字m1,例如输入是400321,那么m1是321
                int m1 = _x / (pow(10, len - 1));
                m1 = m1*pow(10, len - 1);
                m1 = _x - m1;
     
                //计算输入x的最高位那个数出现的次数,当前输入时400321,只计算4出现的次数
                c[m] = c[m] + (m1 + 1);
     
     
                int after = (pow(10, len - 1));
                //dv是_x的长度,之后,和得到的新的_x的长度作差,然后减去1,得到0的个数,输入400321 ,下面的变量NumOfZero将会等于2
                int dv = get_length(_x);
                //获取除最高位以外,剩余的数字_x,下一轮循环用剩余的数字_x作为输入,现在,更新后的 _x==321 ,下一轮循环,将使用321作为输入
                _x = _x % after;
                //把输入x中的0算进去,例如把400321中的两个0算进去
                int NumOfZero= (dv - get_length(_x) - 1)*(_x + 1);  //在这里,(2)* 322, 计算400321中两个0出现的次数
                c[0] = c[0] + NumOfZero;
            }
     
            //把多余的0减去
            c[0] = c[0] - s(get_length(x));
     
            for (int i = 0;i <= 9;i++) {
                cout << "数字" << i << "用的次数:" << c[i] << endl << endl;
            }
            
        }
     
    }
     
     
    //n是位数,表示几位数0~9用的次数
    int f(int n) {
        return n*pow(10, (n - 1));
    }
     
    //n是输入x的位数,去除多余的0
    int s(int n) {
        return ((pow(10, n) - 1) / 9);
    }
     
    //获取输入x的长度
    int get_length(int x) {
        int count = 0;
        while (x != 0) {
            x = x / 10;
            count++;
        }
        return count;
     
    }
     
    //获取除0以外的数字的位数,例如400321,调用此函数以后,返回值就是4,
    int get_nozero_lenth(int x) {
        int count = 0;
        int y = x;
        while (x != 0) {
     
            x = (x / pow(10, get_length(x) - 1));
            x = x*pow(10, get_length(y) - 1);
            x = y - x;
            y = x;
            count++;
        }
        return count;
    }
    
    

    效果:

    image.png

    相关文章

      网友评论

          本文标题:计算页码各个数字出现的次数

          本文链接:https://www.haomeiwen.com/subject/cgxnfctx.html