出题:不同大小烙饼的排序问题:对于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的位置的更多相关文章

  1. POJ 1401:Factorial 求一个数阶乘的末尾0的个数

    Factorial Time Limit: 1500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 9349 Descri ...

  2. 计算阶乘n!末尾0的个数

    一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= ...

  3. N的阶乘末尾0的个数和其二进制表示中最后位1的位置

    问题一解法:     我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10, 我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个 ...

  4. Algorithm --> 求阶乘末尾0的个数

    求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...

  5. 求N的阶乘N!中末尾0的个数

    求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...

  6. 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 ...

  7. 计算n的阶乘(n!)末尾0的个数

    题目: 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数. 举例: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= 24 ...

  8. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  9. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

随机推荐

  1. bzoj 4785: [Zjoi2017]树状数组【树套树】

    参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...

  2. 第三篇(那些JAVA程序BUG中的常见单词)

    illegal modifier for parameter xxx; only final is permitted 参数xxx的修饰符非法:只允许final illegal 非法的 modifie ...

  3. Luogu P2920 时间管理【二分答案】

    二分答案水题. (像我这么蒻的人都能十几分钟A掉) https://www.luogu.org/problemnew/show/P2920 开始时间一定在从0到min(t[i]-s[i])的一段区间上 ...

  4. python 37条编程技巧-汇总(转载+整理)

    1.原地交换两个数字 x, y =10, 20 print x, y y, x = x, y print x, y 10 20 20 10 2.链状比较操作符 n = 10 print 1 < ...

  5. Android UI 设计规范

    1. 基础常识 1.1 主流屏幕尺寸 标识 屏幕尺寸 hdpi 480 * 800 xhdpi 720 * 1280 xxhdpi 1080 * 1920 1.2 图标尺寸 标识 启动图标尺寸 菜单图 ...

  6. javascript---DOM大编程

    编程练习 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点 ...

  7. 51nod 1874 字符串排序

    1874 字符串排序  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 定义一个字符串的无序度为所有位置后面的字母比该位置的字母小的总数之和.比如&q ...

  8. 435 Non-overlapping Intervals 无重叠区间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠.注意:    可以认为区间的终点总是大于它的起点.    区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠.示例 ...

  9. 转】MongoDB主从复制实验 master/slave

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: May 31, 2013 Ta ...

  10. [转]asp.net 跨域单点登录

    本文转自:http://tech.e800.com.cn/articles/2009/814/1250212319986_1.html 单点登录(Single Sign On),简称为 SSO,是目前 ...