上台阶问题——利用高中排列组合知识
问题描述
一共有num节台阶,一次可以上一节或者上两节,问一共有多少种走法
例如:num = 4,则有一下几种情况:
- 走四步:一次一节上
- 走三步:一次两节+两次一节
走两步:两次两节
故上四节楼梯一共有五种走法
思路
若问上五十节台阶有多少种走法
不采用 “一次上两步” 的走法
一共要走50步,每步都上一个台阶,所得结果为:
采用一次 “一次上两步” 的走法
一共要走49步,48步上一个台阶,1步上两个台阶,所得结果为:
采用两次 “一次上两步” 的走法
一共要走48步,46步上一个台阶,2步上两个台阶,所得结果为:
… … … … … …
… … … … … …
… … … … … …
最多采用50 / 2 = 25次 “一次上两步” 的走法
一共要走25步,每步都上两个台阶,所得结果为:
综上,把所有情况的累加就是最终答案
规律总结
通过以上分析可得出,如果总台阶数为num,则走法的数量为:
代码实现
创建一个名为Steps的类
num :总台阶数
ok :初始值为0,判断能否约分
getOptions() :获得所有走法的总数量
getUp() : 获得分母
getD() : 获得分子
关键:
因数据过大,主要要解决数据溢出问题,故想办法将数据变小,有两个方面可以减小数据
约分,在计算分母的getU()方法中,设定当n达到一定大小时(38行,这里定为
10), 每多乘以一个数,就判断当前值能否整除7的阶层,若可以整除(38行),
则 将ok的值设为1,并将结果除以7的阶层以达到减小数值防止溢出的作用,然后,
用ok的值为1作为判条件在getD()方法计算分子时,可直接从8开始算起(54行),
同时,为防止在getU()方法中的值在后来的计算中又出现可以整除7的阶层的数,
故用ok的值作为判断 条件,如果ok等于0,则进入,并将OK的值改为1,反过来
制约下一次碰到整除7的阶层的数导致多除(记得每循环一次后讲ok置零,第14
行和21行)利用排列组合的对称性可得到该公式
当不等式2b > a-b,即b>( a / 3 )成立时(第9行),可利用该公式,减小运算结果,防止数据溢出
Steps类代码
public class Steps {int ok = 0, num;public long getOptions(int num) { // num为总台阶数long sum = 0, a, b;long c;this.num = num;for (int n = 0; n <= (num / 2); n++) { // n为一次走两步的次数,取值范围从0到 num / 2if (n > (num / 3)) {a = getU(num - n, num - 2 * n);b = getD(num - 2 * n);c = a / b;sum += c;ok = 0;continue;}a = getU(num - n, n);b = getD(n);c = a / b;sum += c;ok = 0;}return sum;}private long getU(int a, int n) {long f = 1;int start = a - n + 1;if (n == 0 || n == a) {return f = 1;} else if (n == 1) {return f = a;}for (int i = a; i >= start; i--) {f = f * i;if (n > 10 && f % 5040 == 0 && ok == 0) {ok = 1;f = f / 5040;continue;}}return f;}private long getD(int n) {long f = 1;if (n == 0)return f = 1;else if (n == 1) {return f = 1;} else if (ok == 1 && n >= 10) {for (int i = 8; i <= n; i++) {f = f * i;}return f;} else {for (int i = 2; i <= n; i++) {f = f * i;}return f;}}
}
测试类代码
class Text {public static void main(String[] args) {Steps a = new Steps();System.out.println("一共有 " + a.getOptions(50) + " 种走法");}
}
运行结果
当台阶数为4时
当台阶数为30时
当台阶数为50时
总结
以上就是我对上台阶问题的想法,可能比递归复杂很多,但是是我自己的想法。
ps:发这篇文章主要是记录记录自己的想法,如果说的有什么不对的地方欢迎大家指正。
初次入坑,请各位大佬多多指教
上台阶问题——利用高中排列组合知识相关推荐
- 突发奇想想用C解决高中排列组合问题
题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 很简单的一道高中题目,用程序来也是很好实现的.话不多说,直接上代码. #include<stdio.h> ...
- C语言山行组合数,高中排列组合基础题-(含答案).doc
排列.组合问题基本题型及解法 同学们在学习排列.组合的过程中,总觉得抽象,解法灵活,不容易掌握.然而排列.组合问题又是历年高考必考的题目.本文将总结常见的类型及相应的解法. 一.相邻问题"捆 ...
- P3223 [HNOI2012]排队(高中排列组合)
传送门 题意 nnn个男生,mmm个女生,222个老师排队 女生和女生不能相邻,老师和老师不能相邻,问方案数. 考虑到老师只有两个,所以可以对老师来讨论. Ⅰ.\color{Red}Ⅰ.Ⅰ.两只老师间 ...
- 组合数学-排列组合整理
此文是我整理组合数学排列组合知识的博文,排列组合从零开始...加油! 1.重复组合: 从n种不同元素中取出m的元素(方法是从n个元素中每次取出一个后,放回,再取另外一个,直到取出m个元素),每一种元素 ...
- 计算组合数c语言ac,AC排列组合
一共6个人里选2个,C=15 [排列组合]什么时候用排列,什么时候用组合?二者差别在哪里 一组数里的元素次序颠倒不要紧的时候Yong组合,颠倒算第二种情况的用排列. 就是说假如用abcdefg中的5G ...
- C语言利用循环方法实现排列组合
排列组合是我们高中时期就学过的知识,还记得当初被甲乙丙丁们站在一排的数学问题所折磨,苦不堪言呐.在实际编程过程中,我们也常遇到排列组合的问题. 那么,什么是排列组合呢?百度百科给的解释通俗易懂.排列组 ...
- 利用排列组合公式Cnm输出杨辉三角(C语言实现)
二项式定理与杨辉三角联系十分紧密.杨辉三角的第 n 行的第 m(设m从0开始数) 个数即 n 次二项式展开的第 m 个系数,因此杨辉三角某行某列上的数都可以通过二项式定理的系数来得知,计算n次二项式展 ...
- 学习笔记---高等数学前置知识---数列、排列组合、解不等式
数列 等差(a1即首项,d即公差,n即项数) 通项公式: 前n项和公式:或 等比(a1即首项,q即公比,n即项数) 通项公式: 求和公式: 附: 裂项公式: 常在计算数列和时用于裂项相消法 例: 1/ ...
- 自编高中数学---排列组合公式推导
知乎一个竞赛生写的排列组合文章:https://www.zhihu.com/question/26094736 一.排列 ,Permutaion 把n件东西往m个位置里排序,有多少种排法? 记排列方法 ...
最新文章
- 干货|2020年以后人工智能的几点思考
- ScrollView嵌套ListView处理事件冲突
- android 状态机的作用,Android 状态机、状态模式 基础框架实现
- DHCP数据抓包分析--wireshark
- vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项
- 纸板怎么切割光滑_激光切割机大PK!光纤、CO2、YAG,你选谁?!
- 1.1.0-简介-P11-分布式锁的解决方案
- 性能测试之JMeter配置元件【计数器】
- 常见的网页布局(HTML、CSS)
- 使用k-近邻算法改进约会网站的配对效果
- Charles for Mac(抓包工具)
- 20170403_Windows网络编程视频学习1
- 深信服 云桌面 linux,深信服桌面云-深信服桌面云下载 v3.0官方版--pc6下载站
- 通俗易懂的虚短、虚断的使用条件?
- WinHex的使用指南(图文详细版)
- 咪咕音乐HTML代码,python3爬取咪咕音乐榜信息(附源代码)
- c++ Dxgi+FFmpeg 完成对截图屏幕,以及将屏幕数据保存为MP4格式,以完成录屏功能
- 基于Android手机酒店客房预订系统
- 边境的悍匪—机器学习实战:第五章 支持向量机
- Oracle安装步骤(记录)
热门文章
- linux 宝塔 卸载mysql_宝塔面板(linux)卸载的一些方法的整理以及卸载之后一些文件的删除...
- FL Studio最新20.9中文版DJ电子音乐制作神器
- 一文读懂大唐杯所有名词解释
- @Autowired注入、构造器注入、setter注入的使用方式?区别?
- 【星云测试】Wings-让单元测试智能全自动生成
- i春秋-密码-IceCTF-Alien Message
- 苹果计算机单位说明书,手把手教你用苹果电脑玩转办公
- (秋招/春招)软件开发/软件测试面试题——计算机网络部分
- 英伟达 (Nvidia) GPU 系统管理界面(SMI)
- 英伟达帝国的一道裂缝