[编程题]页码统计

题目

牛客网 https://www.nowcoder.com/questionTerminal/3a003cb6a3174ef9835fa603e01d8b52

牛客网原题:

牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?

思路

按位数某个数字出现过多少次。也就是说,固定某一位上的某个数,看看此时有几种情况。

举个栗子:

对统计1~785012中5出现的个数

我们先考虑5在低位第三位出现的次数,我们就将第三位固定为5:XXX5XX。

此时,问题就转化为,“X”处一共有多少种组合方式。

高位的3位可以从000到785之间,低位的2位可以从00到99之间。

但是,当高3位为785时,7855XX无论如何都超过了785012,因此,高三位可以选择的只有000~784(共785个数字),高三位和低二位一共有785*100种组合方式。

我们再考虑5在低位第四位出现的次数,我们就将第四位固定为5:XX5XXX。

与前面相同,高位的二位可以从00到78之间,低位的三位可以从000到999之间。

当高位是00到77时,与前面一种情况是相同的,一共可以组合出78*1000种情况。

当高位是78时,785XXX就有超过785012的可能了,后三位的选择局限在000到012之间,共13中情况。

两者结合就是:78*1000+13

最后考虑5在低位第5位出现的次数,我们就将第五位固定为5:X5XXXX。

与前面相同,最高位可以从0取到7,低四位可以从0000取到9999.

当最高位为0到6时,与第一种情况相同,一共可以组合出7*10000中情况。

当高位是7时,与前面的情况不同的是,75XXXX是不会越界的,后四位可以从0000取到9999,所以可以组合出10000中情况。

两者结合就是:7*10000+10000

但是,当统计0的个数时,情况又有所不同。还用785012讨论,如果我们要统计低位低2位出现0的次数,按照前面的方法,我们可能把00000X讨论进来,认为这也是第二位出现0的情况,但是这个数只能表示为X,它的第二位根本不存在。

因此,针对0这种情况,我们需要单独讨论,只需要分成两类,不可能存在当前位小于0的情况,不过每次高位的取值要把全0的情况剔除。

代码

我的代码如下

#include <iostream>
using namespace std;

//count the bit of N, and the low_n/high_n at lowest bit/highest bit
int countBit(int n, int *low_n, int *high_n)
{
	int t = n;
	int res = 0;
	int high;
	*low_n = t % 10;
	while (t > 0)
	{
		res++;
		high = t % 10;
		t = t / 10;
	}
	*high_n = high;
	return res;
}

int pow(int n, int x)
{
	int t = 1;
	for (int i = 0; i < x; i++)
		t *= n;
	return t;
}

int main(int argc, char** argv)
{
	int n;
	int i, j, k, t;
	int low, high, len;	//low: 0th number; high: len-th number; len: lenghth of n;
	int lown, highn, curn;	//highn: number before current bit, lown: after curent bit; curn: current bit;
	int result[10];

	cin >> n;
	len = countBit(n, &low, &high);

	for (i = 0; i < 10; i++)	result[i] = 0;
	for (i = 0; i < len; i++)
	{
		t = pow(10, i);
		highn = n / (t * 10);	lown = n%t;	curn = (n/t) % 10;
		for (j = 0; j < 10; j++)
		{
			if (j == 0)
			{
				if (i == len - 1)
					continue;
				if (curn == 0)
					result[j] += (highn - 1)*t + (lown + 1);
				else
					result[j] += highn * t;
			}
			else if (j == curn)
				result[j] += highn * t + (lown + 1);
			else if (j>curn)
				result[j] += highn * t;
			else //j<curn && j!=0
				result[j] += (highn+1) * t;
		}
	}
	//output
	cout << result[0];
	for (i = 1; i < 10; i++)
		cout << " " << result[i];
	return 0;
}

PS,自己写pow函数的原因 - 公司的算法考试不允许使用stdlib和stl,所以习惯自己写。

这是我的第一个newcoder题。

时间: 2024-08-29 01:49:26

[编程题]页码统计的相关文章

编程题:统计1~20之间不能被3整除的数的个数并输出这些数

以下程序是用break和continue语句来实现的. #include<stdio.h> void main() { int n,s; for(n=1,s=0;n<=20;n=n+1) { if(n%3==0) continue; printf("%d\t",n); s=s+1; } printf("\ntotal:%d\n",s); } 算法分析与流程图: 运行结果: 编程题:统计1~20之间不能被3整除的数的个数并输出这些数,布布扣,bubu

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

JavaScript编程题(含腾讯2016校招题)

作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几道觉得挺有意思的编程题,感觉做下来,自己对一些新方法的看法有了新的变化. 比如indexOf,reduce,Array.isArray,forEach这些方法,以前一看到兼容性是IE9+就有点害怕,项目中不敢用,导致后面越来越陌生,不过现在一想的话.其实只要用Polyfill或者提前fix掉就可以了

[编程题-搜狐]马戏团

[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列. 现在

上机操作编程题

一.写一个简单的缓存系统 1 package com.wisezone.demo; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 /** 6 * 上机操作: 7 * 面试题--写一个简单的缓存系统 8 * @author 王东海 9 * @2017年6月5日 10 */ 11 public class CacheDemo 12 { 13 private Map<String, Object> map = new HashMap&

C语言程序设计进阶 第1周编程题

第1周编程题 查看帮助 返回 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 字符串比对(10分) 题目内容: 题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的.你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7来源:牛客网 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子

去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码

编程题很简单.整个试卷结构为: 一.问答题: 对前端的理解,了解哪些框架库? 二.在线编程题:身份证分组 如下第一道:身份证分组 三.在线编程题:身份证分组.统计字符.酒店价格(三选二) 如下第二三四道题中三选二作答. 我也搞不懂为什么有两部分编程题~~~下面详细说一说编程题目及JS代码实现: 第一道:身份证分组 代码: 1 var line; 2 while(line = read_line()){ 3 while(line.indexOf(" ") != -1){ 4 line =

算法导论第1章参考答案与编程题选

系列地址:算法导论(CLRS)参考答案与配套编程题选 1.1 算法 1.1-1 例如大学生学期统计排序以分配奖学金等等. 1.1-2 例如解决问题需要使用的内存等等. 1.1-3 顺序表,优点有支持随机查找,可以在\(O(1)\)内查找元素,缺点是增添/删除元素不方便. 1.1-4 相似:都可以通过带有加权边的图来模拟解决总距离最小化问题. 不同:最短路径和旅行商问题考虑的顶点情况不同,导致复杂度不同. 1.1-5 只有最佳解才行:使用相同外观的钥匙开锁,只有正确的钥匙能打开. 获得近似解也行: