笔试算法题(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 进行核对.测试.欢迎食用 本 ...
随机推荐
- winform 窗体设置成无边框、可拖拽、四周圆角
最近做一个及时通讯系统的登录界面,现在将界面用到的无边框.可拖拽.四周圆角的方法分享如下: 1.无边框的窗体: 把FormBorderStyle的属性设置为none 2.可拖拽:private Poi ...
- Find offset of first/last found substring
DATA: TEXT TYPE STRING VALUE 'RO_LL_OVER BEET_HOVEN', MOFF TYPE I VALUE '-1'. FIND FIRST OCCURRENCE ...
- POJ3233:Matrix Power Series(矩阵快速幂+递推式)
传送门 题意 给出n,m,k,求 \[\sum_{i=1}^kA^i\] A是矩阵 分析 我们首先会想到等比公式,然后得到这样一个式子: \[\frac{A^{k+1}-E}{A-E}\] 发现要用矩 ...
- 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond【spfa】
和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可 #include<iostream> #include<cstdio& ...
- bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】
树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...
- bzoj 1178: [Apio2009]CONVENTION会议中心(少见做法掉落!)【贪心+二分】
数组若干+手动二分一个的算法,bzoj rank8 ===============================废话分割线=================================== 我我 ...
- 洛谷P3833 [SHOI2012]魔法树(树链剖分)
传送门 树剖板子…… 一个路径加和,线段树上打标记.一个子树询问,dfs的时候记录一下子树的区间就行 // luogu-judger-enable-o2 //minamoto #include< ...
- Luogu P1330 封锁阳光大学【Dfs】 By cellur925
题目传送门 这道题我们很容易去想到二分图染色,但是这个题好像又不是一个严格的二分图. 开始的思路:dfs每个点,扫与他相邻的每个点,如果没访问,染相反颜色:如果访问过,进行检查,如果不可行,直接结束程 ...
- Java中关键字continue、break和return的区别
Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break: 跳出循环体,继续执行循环外的函数体 return: 跳出整个函数 ...
- 2017 JUST Programming Contest 3.0 E. The Architect Omar
E. The Architect Omar time limit per test 1.0 s memory limit per test 256 MB input standard input ou ...