算法1 —统计数字问题

问题描述:

一本书的页码从自然数1开始书序编码直到自然数 n 。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第六页 用数字表示是6,而不是06或者006等,数字计数问题要求给定的总页码n,计算出书的全部页码中分别用到多少次数字 0,1,2,...........9。

编程任务:给定书的总页码的十进制整数n (1<=n<=10^9)。编程计算书的全部页码中分别用到多少次0,1,2,3,..............9

/**********************************************************************
 * Copyright (c)2015,WK Studios
 * Filename:
 * Compiler: GCC,VS,VC6.0  win32
 * Author:WK
 * Time: 2015 4 2
 ************************************************************************/
//1.<span style="font-family:Microsoft YaHei;">第一次算法思想</span>
<span style="font-family:Microsoft YaHei;">//</span>代码时间复杂度为O(n*log10(n)),
//对m个输入整数进行计算,则需要的时间为 1*log10(1) + 2*log10(2) + ... + m*log10(m),
//根据函数f(x)=x*log10(x),当n > 10时 n*log10(n)>n 当n<=10时 n*log10(n)<n
//所以对于m个整数输入可以近似为 1+2+3+.......+m  近似 m*m 为 该函数的下界
//对于 30万 数据 运行时间就是9*10^10
#include<iostream>
using namespace std;

void count_num(int n)
{
	int count[10]={0};
	for (int i=0;i<=n;i++)
	{
		int t=i;
		if(0==t)
		{
			count[0]++;//计算第一个0的个数
		}

		while(t)
		{
			count[t%10]++;//计算高位出现次数
			t/=10;//依次向低位
		}
	}
	for( i=0;i<10;i++)
	{

		cout<<"present num of  "<<i<<"   is   "<<count[i]<<'\n';
	}

}

int main()
{

	count_num(34567);

	return 0;
}
时间: 2024-11-06 07:25:07

算法1 —统计数字问题的相关文章

统计数字noip2007

7909:统计数字 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入 包含n+1行:第一行是整数n,表示自然数的个数:第2~n+1每行一个自然数. 40%的数据满足:1<=n<=1000:80%的数据满足:1<=n<=50000:100%的数据满足:1<=n

1166: 零起点学算法73——统计元音

1166: 零起点学算法73--统计元音 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1082  Accepted: 402[Submit][Status][Web Board] Description 统计每个元音字母在字符串中出现的次数. Input 输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串,只由小写字母组成. Output 对于每个测试实例输出5行

每天一道算法题:数字二进制形式中1的个数

题目:请实现一个函数,属于一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位为1.因此如果输入9,该函数输出2. 可能的死循环陷阱 看完题目,相信大家很快就能想到一个解题思路:先判断整数二进制表示中最右边的一位是否为1,接着把输入的整数右移一位,此时原来处于从右边起的第二位被移动至最右边了,再判断是不是1,这样每次移动一位,直到这个整数变成0,即能够得到整数二进制表示形式中1的个数,而现在问题变为如何判断数字的最后一位为1,其实这个也很简单,只需要将数字与1做与运算,

统计数字

原题链接:https://www.luogu.org/problem/show?pid=1097 纪念开学第一天,随手A掉一道大水题纪念一下. 题意非常明显,让我们排序并且统计数字,但数据量较大. 一开始想到最暴力的桶排序,但发现桶排序开不了那么大的数组,A不掉. 遂STL快排解决之.问题就在如何统计重复数字上. 受到夏令营day1t1启发,快排后统计数字,每次和前边的进行比较,如果相等则当前数字重复,开一个vis数组打上标记,开一个b数组外带一个附带指针t,用来记录重复数字重复出现了几次.如果

7909:统计数字

7909:统计数字 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入 包含n+1行:第一行是整数n,表示自然数的个数:第2~n+1每行一个自然数. 40%的数据满足:1<=n<=1000:80%的数据满足:1<=n<=50000:100%的

1164 统计数字

1164 统计数字 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入描述 Input Description 第1行是整数n,表示自然数的个数.第2~n+1 行每行一个自

统计数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数: 可定义一个用于统计数字个数的变量count,然后从前往后遍历数组,看是否与所求数字相等,如果相等,则count++: 下面贴出代码: public class Solution {     public int GetNumberOfK(int [] array , int k) {         int count = 0;        for(int i=0;i<array.length;i++){            if(array[i]==k

【来写个2048吧】—— 移动算法与随机数字生成

一.移动算法 其实2048的移动算法蛮简单,看代码很容易明白,就不多说了. 向左滑动 //左滑动 bool GameScene:: doLeft () { //判断有没有发生移动 bool isMove = false ; for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { for ( int x1 = x +1 ; x1 < 4; x1++) { if ( cardArr [x1 ][ y]-> getN

腾讯面试题(统计数字出现的次数问题)

时间:2014.04.28 地点:基地二楼 日志:知道自己没有尝试着去试图改变,晓得错了~~ ---------------------------------------------------------------- 一.题目: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数. 上排的十个数如下: [0,1,2,3,4,5,6,7,8,9] 举一个例子, 数值:0,1,2,3,4,5,6,7,8,9 分配:6,2,1,0,