【3006】统计数字
统计数字
Time Limit: 3 second
Memory Limit: 2 MB
【问题描述】
一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0、1、2、3、4、5、6、7、8、9。其中每个页码不含多余的0,如N=123时,第5页不是005,只是5,第12页不是012,只是12。
【输入】
输入文件仅一行,一个正整数N(N≤109),表示总的页码数。
【输出】
输出文件十行,第K行为数字k-1的个数,即第一行为数字0的个数,第二行为数字1的个数,第三行为数字2的个数,以此类推。
【输入样例】
11
【输出样例】
1 4 1 1 1 1 1 1 1 1
【题解】
这题很恶心,没错 又是恶心这个词,以后只可能会越来越多地出现这个词。不会减少。。。
我是看着题解写的程序。
首先,从000-999 我们不要删掉多余的0,那么我们会有1000个3位数,然后一共有3000个数字出现过,可以想想0-9,每个数字都只出现一次,00-99,也可以知道0-9每个数字都出现相同的次数。推广一下,000-999每个数字出现的次数也是一样的。
然后3000个数字,0-9有10个,则每个数字都有用到300次。
先别问我0的事!
然后我们举个例子。
6147
我们先看6,6之前有0-5,后3位,都从000-999变化,刚才我们算出来了,每个数字都会用到300次,0-5有6位,所以a[0..9]+=6*300;
然后是0-5这6个数字作为第一位,每个都出现过1000次,即0XXX 1XXX 2XXX...其中XXX ∈ [000,999];
最后是6,6我们要单独处理,要加上148,即6XXX,XXX∈[000..148];
然后处理1,4,7就好。
(这里你用while已经能写出来了,只要按照6的规律就可以)
接下来是0的问题了。
①
先从只有一位数的情况开始。
比如6;
我们先会看看6后面有没有数字,没有。
然后看看6前面有没有数字,有。要加上几呢? 假设l是数字的长度,我们肯定会这样做的
t = 1
for (int i = 1; i<=l-1;i++)
t = t *10;
这里如果是上面说的6174,l=4,则t=1000;
但是这里我们是以6为例,所以t = 1;
然后for (int i = 0;i <=5;i++)
a[i]+=t;
这里已经多出来一个0了。
剩下步骤省略。。
対,如果一位数字会多出1个0;
②
两位数。
比如12
我们先会看1后面有没有数字,有。
那就用下我们上面的公式。
0-9有10个一位数字。。。。然后每个数字被用一次。
则a[0..9]+=1;
//这里出现的0是多出的。
然后是0 被用了 10 次 0-9,
//这里的0也是多出来的。即00 01 02 03...09;
这里出现了11个多余的0
剩下步骤省略,因为没有出现多余的0.
③
111
④
1111
即多出的0是数字的位数。
【代码】
#include <cstdio>
#include <iostream>
#include <string>using namespace std;string s1;
unsigned int n;
int a[10];void input_data()
{cin >> s1;
}void get_ans()
{int l = s1.size(); //先获取数据的长度for (int i = 0;i <= 9;i++) //每个数字使用的数目初始化a[i] = 0;int t = 0;for (int i = 1;i <= l;i++) //先减去多余的0,即l(字母L)个1(数字1)t = t*10 + 1;a[0] -= t; //减去多余的0while (l > 0) //如果还能继续减少长度 基本上写出第一层第二层就不会有问题了。{int m = s1[0] - '0'; //先取出头数字t = 1;for (int i = 1;i <= l-1;i++) //这里是6174中 6时的1000t = t * 10;int tt = (t * (l-1))/10; //000 - 999 中每个数字被使用的次数 while进行一次就变成00-99for (int i = 1;i <= m;i++) //0XXX 1XXX 2XXX 。。。。mXXX 中的 XXXfor (int j = 0;j <= 9;j++)a[j] += tt;for (int i = 0;i <= m-1;i++) //0XXX 1XXX 2XXX ... mXXX中的 1..ma[i] += t;s1 = s1.erase(0,1); //这是从int ttt =0;l = s1.size();for (int i = 0;i <l;i++)ttt = ttt*10 + s1[i] - '0';ttt++;a[m] += ttt; //这是统计6147 中的148.}}void output_ans()
{for (int i = 0 ;i <= 9;i++)printf("%d\n",a[i]);
}int main()
{input_data();get_ans();output_ans();return 0;
}
转载于:https://www.cnblogs.com/AWCXV/p/7632451.html
【3006】统计数字相关推荐
- C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...
//用switch...case语句统计数字.空格和其他字符出现的次数 //转自K&R #include int main(void) { int c, i, nwhite, nother, ...
- 统计数字,空白符,制表符_为什么您应该在HTML中使用制表符空间而不是多个非空白空间(nbsp)...
统计数字,空白符,制表符 There are a number of ways to insert spaces in HTML. The easiest way is by simply addin ...
- 算法设计原则验证实验报告_算法设计与分析实验报告 统计数字问题
一 . 实验要求 1 .掌握算法的计算复杂性概念. 2 .掌握算法渐近复杂性的数学表述. 3 .掌握用 C++ 语言描述算法的方法. 4 .实现具体的编程与上机实验,验证算法的时间复杂性函数. 二 . ...
- 第十七期:2019人工智能统计数字和一些重要事实
人工智能(AI)每天在以惊人的速度发展.这项技术在2018年已经取得了巨大的成功,简化医疗保健业的工作流程,降低制造业的间接费用,并减少教育业的行政工作量.现在是2019年,每天似乎都有一家新的AI初 ...
- java常用的统计_(OJ)Java常用类-统计数字次数
统计数字次数 Problem Description 命令行输入一个由数字组成的任意字符串,统计出每个数字出现的次数. Input Description 1239586838 Output Desc ...
- 信息学奥赛一本通(1239:统计数字)
1239:统计数字 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6439 通过数: 2627 [题目描述] 某次科研调查时得到了n个自然数,每个数均不超 ...
- Vijos P1816 统计数字【序列处理】
描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计 ...
- c语言统计出现个数,C语言统计数字出现的个数
程序功能:统计数字出现的个数 例如:输入1 2 3 1 2 4 2 3 1 输出:1 3 2 3 3 2 4 1 能看懂吗?就是1出现3次,2出现3次,3出现2次,4出现1次 #define M 50 ...
- 统计数字问题Python
问题描述 统计数字问题:一本书的页码从自然数1开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如第6页用6表示而不是06或006.数字统计问题要求对给定书的总页 ...
最新文章
- numpy中矩阵运算的特点
- js、css的阻塞问题
- linux sh文件case,Shell脚本case语句简明教程
- Linux的vim编辑器中的翻页命令
- 设计方案,拿来吧你!
- android学习之-Style样式的定义
- 好用的电脑录屏软件!来看看这几款!
- 【系统分析师之路】第十七章 复盘多媒体基础知识
- 单片机初始化WIFI模块
- 测试报告包含哪些内容?
- html tr行内样式左对齐,探索CSS单行文字居中,多行文字居左的实现方式
- OpenERP/Odoo的架构
- Python课堂作业(用于复习)
- 鼠标划动网页或者窗口时进度条总是上下乱跳,有可能是你的上下按键坏掉了
- iOS app添加桌面快捷方式
- 改变linux字体的大小,如何更改字体并调整其大小?
- 整车电源状态 K15 KL30 KL31
- 人和人之间的距离有多远
- 前端开发常用编辑器,你用过哪几个?
- python中find函数是什么意思_find函数什么意思
热门文章
- MHA高可用主从复制实现
- Leetcode 62. Unique Paths
- 代码实现把字符串反转
- 移动端给img加上max-width:100%
- SQL Prompt 5.1使用
- POJ 2336 Ferry Loading II 动态规划
- 禅道项目管理软件的命令行入口
- 在GridView里使用上下箭头(小键盘旁边)来选择记录
- 图像识别工程师 VS The application has requested the Runtime to terminate it in an unusual way.
- unity3d Update()和FixedUpdate()的区别