笔试算法题(33):烙饼排序问题 & N!阶乘十进制末尾0的个数二进制最低1的位置
出题:不同大小烙饼的排序问题:对于N块大小不一的烙饼,上下累在一起,由于一只手托着所有的饼,所以仅有一只手可以翻转饼(假设手足够大可以翻转任意块数的 饼),规定所有的大饼都出现在小饼的下面则说明已经排序,则最少需要翻转几次,才能达到大小有序的结果(改变饼的顺序只能整体翻转,不能相邻交换);
分析:
- 假设饼大小编号为1,……,N,1就是最小的饼,N就是最大的饼,最大的N饼翻转到最下面之前,一定需要达到最上面,所以首先需要寻找N饼所在的位置,翻 转到最上面,然后翻转所有的饼,这样N饼就可以就位;
- 然后针对N-1饼,直到1饼。翻转的次数最大为2*(N-1)(如果当前需要就位的饼就在最上面,则 只需一次翻转,不然每块饼就位需要翻转两次,最后一块饼不用翻转就已经就位);
- version1的策略是每次找出0到index内最大的烙饼,翻转后与index+1的烙饼相邻(最大与次大相邻);但是可能有其他的“让某两块饼相邻”的策略使得翻转次数小于2*(N-1),所以可以穷举翻转策略,然后选择最优的一个解(翻转次数最少);
解题:
/**
* 注意此处的length为target的元素个数
* */
void reverse(int* target, int length) {
int temp;
int i;
for(i=;i<length/;i++) {
temp=*(target+i);
*(target+i)=*(target+(length-i-));
*(target+(length-i-))=temp;
}
} void version1(int *array, int length) {
int index=length-, curmax;
/**
* 最后一块饼在倒数第二块饼就位时就已经就位,
* 所以循环次数为N-1,0表示最上层,index表示
* 最下层
* */
while(index>) {
/**
* 寻找0到index内最大值
* */
curmax=;
for(int i=;i<=index;i++) {
if(array[curmax]<array[i])
curmax=i;
}
/**
* 将最大值翻转到索引0处
* */
reverse(array, curmax+);
/**
* 将最大值翻转到index处
* */
reverse(array, index+); for(int i=;i<;i++)
printf("%d, ",array[i]);
printf("\n");
index--;
}
} int main() { int array[]={,,,,,};
version1(array,);
return ;
}
出题:关于阶乘的几个问题:给定一个整数N,则N!的末尾有多少个0,N!的二进制表示中最低位的1所在的位置;
分析:
- 对于N!十进制表示末尾的0的个数,其来自于5与偶数的乘积,由于偶数相对较多,所以主要取决于各个数字分解之后为包含5的个数。N!=N*(N-1)*(N-2)*……*2*1,则针对每一个乘数K,将其分解为(5^i)*M的形式计算第二个来源贡献的0的个数;
- 对于N!二进制表示的最低位的1的位置,也就是确定最低的2^i的位置,也就是求N!分解为2的质因子的个数;
解题:
int count_0_in_factorial(int n) {
int count=;
int c5,n5;
/**
* 外循环遍历n,n-1,n-2,……1
* */
while(n>) {
/**
* 计算数字如5,10,15等能够被5整除的数字中
* 包含5的个数
* */
c5=;n5=n;
while(n5%==) {
c5++;
n5/=;
}
count+=c5;
n--;
}
return count;
}
int count_low_1_factorial(int n) {
int index=;
while(n!=) {
n>>=;
index+=n;
}
return index;
}
int main() {
int c=;
printf("%d\n",count_0_in_factorial(c));
return ;
}
笔试算法题(33):烙饼排序问题 & N!阶乘十进制末尾0的个数二进制最低1的位置的更多相关文章
- POJ 1401:Factorial 求一个数阶乘的末尾0的个数
Factorial Time Limit: 1500MS Memory Limit: 65536K Total Submissions: 15137 Accepted: 9349 Descri ...
- 计算阶乘n!末尾0的个数
一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= ...
- N的阶乘末尾0的个数和其二进制表示中最后位1的位置
问题一解法: 我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10, 我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个 ...
- Algorithm --> 求阶乘末尾0的个数
求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...
- 求N的阶乘N!中末尾0的个数
求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...
- Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes
题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in ...
- 计算n的阶乘(n!)末尾0的个数
题目: 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数. 举例: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= 24 ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
随机推荐
- 476. Number Complement(补数)
Given a positive integer, output its complement number. The complement strategy is to flip the bits ...
- CodeForces 721A One-dimensional Japanese Crossword (水题)
题意:给定一行字符串,让你输出字符‘B'连续出现的次数. 析:直接扫一下就OK了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024 ...
- poj 3130 How I Mathematician Wonder What You Are! 【半平面交】
求多边形的核,直接把所有边求半平面交判断有无即可 #include<iostream> #include<cstdio> #include<algorithm> # ...
- (DP ST表 线段树)51NOD 1174 区间中最大的数
给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...
- [转]Boosting
1 Boosting算法的起源 Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.Boosting是一种提高任意给定 ...
- [POI2001]Goldmine
Description Byteman作为Byteland的The Goldmine(某一公司厂矿)的最有功的雇员之一,即将在年末退休.为了表示对他的 认真勤恳的工作的承认,The Goldmine的 ...
- [ZPG TEST 118] 最大值【dp+离线】
题4 最大值(findmax) [题目描述] 找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令max=a[0](数组下表从0..N-1),如果a[i]>max,就更新max ...
- 题解报告:hdu 1230 火星A+B(字符串)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1230 Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要 ...
- hdu3433A Task Process( 二分dp)
链接 二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B #include <iostream> #include<cstdio> #incl ...
- AJPFX关于代码块的总结
代码块: { 执行语句; }(1) 当出现在局部位置时, 为局部代码块. 局部位置: 如语句块中, 函数中, 构造代码块中, 静 ...