1-1统计数字问题(详解)
题目描述:从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统计数字问题(详解)相关推荐
- 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解
HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID. 基数就是指一个集合中不同值的数目,比如 a, b, c, d 的 ...
- R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)
此文为<精通机器学习:基于R>的学习笔记,书中第九章详细介绍了无监督学习-主成分分析(PCA)的分析过程和结果解读. PCA可以对相关变量进行归类,从而降低数据维度,提高对数据的理解.分析 ...
- http\https的连接过程及数字证书详解
http\https的连接过程及数字证书详解 内推军p185 http连接过程(相当于输入url会发生什么) 1.域名解析 2.发起TCP的三次握手 3.Web浏览器向服务器发送http请求命令 4. ...
- 在数组中删除重复数字(详解)
前言:本期是关于删除重复数字的详解,今天你c了吗? 方法: 双指针 以一组数:3 4 1 0 0 2 3 1 1 2 为例删除重复的数字 step 1:排序 使用双下标法的前提是数组有序(降序or升序 ...
- 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. ...
- python统计奇数和偶数的个数_Python 统计位数为偶数的数字代码详解
问题描述 给出一个整数数组 nums,请返回其中位数为偶数的数字的个数. 示例 1: 输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 34 ...
- 【Leetcode1365】有多少小于当前数字的数字:详解
[Leetcode1365] 有多少小于当前数字的数字 1. 题目 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] ...
- 用户日活月活怎么统计 - Redis HyperLogLog 详解
点击上方"程序员历小冰",选择"置顶或者星标" 你的关注意义重大! HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP ...
- 基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)
摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST ...
- 数字签名和数字证书详解
原文件地址:http://www.tuicool.com/articles/7buueeQ 密钥分为两种:对称密钥和非对象密钥 对称密钥算法:DES 3DES AES,加密算法快 非对称密钥算法:RA ...
最新文章
- iOS SwiftUI篇-2 UI控件 Text Button Image List
- tomcat:Could not publish to the server. java.lang.IndexOutOfBoundsException
- android如何兴起_情感设计的必要兴起
- grace hopper_开源日,在Grace Hopper会议上建立FOSS技能
- linux查看日历_能从远程获得乐趣的 Linux 命令 | Linux 中国
- 语言学 —— 中文的构词与规律
- 在Javascript中,获取到数字超出长度问题
- python while true_小疯谈python(十):程序的控制结构
- 挑战程序设计竞赛_竞赛通知 | 第二届全国高校计算机能力挑战赛——程序设计赛来啦...
- windows防火墙出站规则只允许访问指定域名ip,其他出站ip全部阻止的方法
- 量子计算机和量子纠缠的关系,科普:什么是量子纠缠和量子计算?
- 软件测试中的“银行企业银行对公渠道转账和财务查询和银企对账项目”
- vs 2013 必须先停止生成方可关闭解决方案
- Django邮件应用--QQ邮箱、网易邮箱(一)
- 【直播回顾】Hello HarmonyOS系列应用篇完美收官!
- Android 8.1输入法配置
- IP地址、IPv4和IPv6的关系
- Linux运维-day44-综合架构-playbook剧本的变量、条件语句及循环语句
- PHP 8 - 学习/实践
- c语言程序设计项目教程视频,C语言程序设计项目教程