zoukankan      html  css  js  c++  java
  • 统计页码数字0~9分别出现了多少次

    最简单的方法是依次遍历每个数字,但这种算法时间复杂度太高,若再用上递归,数字一大内存就爆了,时空复杂度都很高,令人无法忍受。

    因此探索出一种目前为止比较满意的方法。

    思路来自《编程之美》计算数字1的个数(友情提示:若没有看过请先翻到后面预习,方便理解代码),拓展一下即可(特别要注意的是计算数字0,它不可能出现在最高位)。时间复杂度为O(logn+1),空间复杂度O(1)。

    这里用的语言是C++,已经过数据集测试。

    //数字0~9出现次数,思路来自《编程之美》计算数字1的个数,拓展之
    //程序格式(输入:long long范围内的正整数;输出:0~9每位数字出现的次数,以空格分隔)
    #include <iostream>
    #include <vector>
    //#include <bits/stdc++.h>
    
    using namespace std;
    
    long long counteach(long long n,int i)  //统计数字i出现个数
    {
        long long iCount=0;
        long long iFactor   =1;
        long long iLowerNum =0;
        long long iCurrNum  =0;
        long long iHigherNum=0;
    
        while(n/iFactor !=0)
        {
            iLowerNum = n-(n/iFactor)*iFactor;
            iCurrNum  = (n/iFactor)%10;
            iHigherNum= n/(iFactor*10);
    
            if(iCurrNum<i)
                iCount += iHigherNum*iFactor;
            else if(i==iCurrNum)
                iCount += iHigherNum*iFactor+iLowerNum+1;
            else if(iCurrNum>i)
                iCount += (iHigherNum+1)*iFactor;
            //处理0的个数
            //若n为1位数,比如本来是1 2 3 4 5 6 ,之前处理成 0 1 2 3 4 5 6,多加了1个0
            //若n为2位数,比如本来是1 2 3 4 5 6 7 8 9 10 11 12,之前处理成 00 01 02 ...09 10 11 12,多加了1+10个0
            //若n为3位数,比如本来是1 2 3 4 ... 115,之前处理成000 001 002 ...009 010 011...099 100...115,多加了1+10+100个0
            //因此需要在每层循环中减去多计算的0的个数
            if(0==i)
                iCount-=iFactor;
    
            iFactor*=10;
        }
        return iCount;
    }
    
    vector<long long> count(long long n)    //依次统计0~9
    {
        vector<long long>res(10,0);
    
        for(int i=0;i<10;i++)
        {
            res[i]+=counteach(n,i);
        }
       return res;
    }
    
    int main()
    {
        long long n;
        cin>>n;
        if(n<1)
        {
            cout<<"n必须为正整数"<<endl;
            return 0;
        }
        vector<long long>res=count(n);
    
        for(int i = 0; i < res.size(); i++)
        {
            i == 0 ? cout << res[i] : cout << " " << res[i];
        }
        return 0;
    }

    附《编程之美》计算数字1的个数:

    『注:本文来自博客园“小溪的博客”,若非声明均为原创内容,请勿用于商业用途,转载请注明出处http://www.cnblogs.com/xiaoxi666/』
  • 相关阅读:
    翻译:《实用的Python编程》03_04_Modules
    翻译:《实用的Python编程》03_03_Error_checking
    翻译:《实用的Python编程》03_02_More_functions
    翻译:《实用的Python编程》03_01_Script
    翻译:《实用的Python编程》03_00_Overview
    翻译:《实用的 Python 编程》02_07_Objects
    翻译:《实用的Python编程》02_06_List_comprehension
    生成器
    python编码
    python迭代器
  • 原文地址:https://www.cnblogs.com/xiaoxi666/p/6518290.html
Copyright © 2011-2022 走看看