题目描述:从1页到n页,统计0到9出现的次数

题解一:暴力

#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;
int main(){int c[10]={0};int n;cin>>n;for(int i=1;i<=n;i++){int tmp=i;while(tmp){c[tmp%10]++;tmp/=10;}}for(int i=0;i<=9;i++){cout<<c[i]<<endl;}
}

题解二:递归

用递归方法显然比暴力节省了时间,解题思路可分为以下6步。

步骤一:求数n的位数len

公式log(n)+1;

可用cmath里的函数:double log10(double x)来求解

步骤二:划分区间并加和

把数n划分成区间,eg,

223,可划分成00-99,100到199(两个区间)

3333,可划分为000-999,1000到1999,2000到2999(三个区间)

在这每一个区间内(除了最高位)0-9出现的次数是(len-1)*10^(len-2)----(列举一下可发现规律)

现在我们知道了每个区间的0-9出现的次数,该求区间数了:

如233区间数就是2,3333的区间数就是3,所以数n的区间数p是n/(10^(len-1))

综上,如3333,从000-2999(除了最高位)0到9的每个数的个数为p*(len-1)*10^(len-2)

步骤三:最高位加和

如3333,上一步我们已经算好从000到2999,(除了最高位)0到9每个数的和了

现在来算最高位

最高位(第4位)的数有0、1、2、3

0:0000-0999共1000个

1:1000-1999共1000个

2:2000-2999共1000个

3:3000-3333共333+1个

设最高位为m可得代码如下

for(int i=0;i<m;i++){c[i]+=pow(10.0,len);
}
c[m]+=1+n%((int)pow(10.0,len-1));

步骤四:递归

处理完3333的000-2999个数以及3作为第len位的情况剩下333递归处理333

即要处理t=n%(10^(len-1))

注意:

(1)若t为0,比如200,此时c[0]要加len-1也就是2!

若数10,则t为0,c[0]要加len-1,也就是1,

然后结束递归.

(2)若t不为0,这里特判一下,若lenT!=len-1说明是诸如10010这种情况,中间两个0还是要处理的,

c[0]+=(len-lenT-1)*(t+1)

步骤五:递归结束后处理0的情况

for(int i=0;i< len;i++) {c[0]-=(int)pow(10.0,(i));
}

这个公式可以这么理解:

当n=21时,要减去的0有:10^0(红色部分)+10^1(黄色部分)

当n=123时,要减去的0有:10^0(红色部分)+10^1(黄色部分)+10^2(灰色部分)

步骤六:输出

(ps,做的时候遇到了一个坑,pow(a,b)函数因为精度问题,有时会输出不准确的结果,所以,在前面加一个round函数,就准确了……我算的时候pow(10.0,len)len是2结果算出来是99……,这个问题还是需要注意的!)

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>using namespace std;int c[10];void solve(int n){//数n的位数int len=log10(n)+1;//最高位的值int p=n/((int)round(pow(10.0,len-1)));for(int i=0;i<10;i++){c[i]+=p*(len-1)*(int)round(pow(10.0,len-2));}for(int i=0;i<p;i++){c[i]+=(int)round(pow(10.0,len-1));}int t=(int)round(pow(10.0,len-1));t=n%t;if(t==0){//如果t为0c[p]++;//最高位加1c[0]+=len-1;//0位加len-1return ;}int lenT=log10(t)+1;if(lenT!=len-1){//若像10010这种情况,中间2个0也要相应的处理c[0]+=(len-lenT-1)*(t+1);}c[p]+=1+t;return solve(t);
}int main(){int n;while(cin>>n){fill(c,c+10,0);int len=log10(n)+1;solve(n);for(int i=0;i<len;i++){c[0]-=(int)round(pow(10.0,i));}for(int i=0;i<10;i++){cout<<i<<" : "<<c[i]<<endl;}}
}

1-1统计数字问题(详解)相关推荐

  1. 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解

    HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID. 基数就是指一个集合中不同值的数目,比如 a, b, c, d 的 ...

  2. R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)

    此文为<精通机器学习:基于R>的学习笔记,书中第九章详细介绍了无监督学习-主成分分析(PCA)的分析过程和结果解读. PCA可以对相关变量进行归类,从而降低数据维度,提高对数据的理解.分析 ...

  3. http\https的连接过程及数字证书详解

    http\https的连接过程及数字证书详解 内推军p185 http连接过程(相当于输入url会发生什么) 1.域名解析 2.发起TCP的三次握手 3.Web浏览器向服务器发送http请求命令 4. ...

  4. 在数组中删除重复数字(详解)

    前言:本期是关于删除重复数字的详解,今天你c了吗? 方法: 双指针 以一组数:3 4 1 0 0 2 3 1 1 2 为例删除重复的数字 step 1:排序 使用双下标法的前提是数组有序(降序or升序 ...

  5. spaa的交互式绘图_第五章:SPSS统计绘图功能详解

    5.1常用统计图 5.1.1操作界面介绍(条图) 5.1.1.1条图的通用界面 5.1.1.2复式条图与分段条图的界面 5.1.2其他常用统计图 5.1.2.1散点图 5.1.2.2线图 5.1.2. ...

  6. python统计奇数和偶数的个数_Python 统计位数为偶数的数字代码详解

    问题描述 给出一个整数数组 nums,请返回其中位数为偶数的数字的个数. 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 34 ...

  7. 【Leetcode1365】有多少小于当前数字的数字:详解

    [Leetcode1365] 有多少小于当前数字的数字 1. 题目 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] ...

  8. 用户日活月活怎么统计 - Redis HyperLogLog 详解

    点击上方"程序员历小冰",选择"置顶或者星标" 你的关注意义重大! HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP ...

  9. 基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)

    摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST ...

  10. 数字签名和数字证书详解

    原文件地址:http://www.tuicool.com/articles/7buueeQ 密钥分为两种:对称密钥和非对象密钥 对称密钥算法:DES 3DES AES,加密算法快 非对称密钥算法:RA ...

最新文章

  1. iOS SwiftUI篇-2 UI控件 Text Button Image List
  2. tomcat:Could not publish to the server. java.lang.IndexOutOfBoundsException
  3. android如何兴起_情感设计的必要兴起
  4. grace hopper_开源日,在Grace Hopper会议上建立FOSS技能
  5. linux查看日历_能从远程获得乐趣的 Linux 命令 | Linux 中国
  6. 语言学 —— 中文的构词与规律
  7. 在Javascript中,获取到数字超出长度问题
  8. python while true_小疯谈python(十):程序的控制结构
  9. 挑战程序设计竞赛_竞赛通知 | 第二届全国高校计算机能力挑战赛——程序设计赛来啦...
  10. windows防火墙出站规则只允许访问指定域名ip,其他出站ip全部阻止的方法
  11. 量子计算机和量子纠缠的关系,科普:什么是量子纠缠和量子计算?
  12. 软件测试中的“银行企业银行对公渠道转账和财务查询和银企对账项目”
  13. vs 2013 必须先停止生成方可关闭解决方案
  14. Django邮件应用--QQ邮箱、网易邮箱(一)
  15. 【直播回顾】Hello HarmonyOS系列应用篇完美收官!
  16. Android 8.1输入法配置
  17. IP地址、IPv4和IPv6的关系
  18. Linux运维-day44-综合架构-playbook剧本的变量、条件语句及循环语句
  19. PHP 8 - 学习/实践
  20. c语言程序设计项目教程视频,C语言程序设计项目教程

热门文章

  1. 浅谈JVM(六):方法调用过程
  2. 听见浪潮存储花开的声音
  3. Java中feign的独立使用
  4. Python以太坊智能合约开发指南
  5. java 日期类Date插入mysql数据库时间总是比参数时间少一天
  6. Linux重装时保留分区
  7. 洛谷 P3797 妖梦斩木棒 解题报告
  8. 益智小游戏《测试脑力》源码H5+安卓+IOS三端源码
  9. python命令行无法使用退格键、方向键
  10. 九个方面告诉你,一个合格的数据分析师,到底要什么能力?