问题描述

一共有num节台阶,一次可以上一节或者上两节,问一共有多少种走法
例如:num = 4,则有一下几种情况:

  1. 走四步:一次一节上

  1. 走三步:一次两节+两次一节

  1. 走两步:两次两节

    故上四节楼梯一共有五种走法

思路

若问上五十节台阶有多少种走法

  1. 不采用 “一次上两步” 的走法

    一共要走50步,每步都上一个台阶,所得结果为:

  2. 采用一次 “一次上两步” 的走法
    一共要走49步,48步上一个台阶,1步上两个台阶,所得结果为:

  3. 采用两次 “一次上两步” 的走法
    一共要走48步,46步上一个台阶,2步上两个台阶,所得结果为:

    … … … … … …

    … … … … … …

    … … … … … …

  4. 最多采用50 / 2 = 25次 “一次上两步” 的走法
    一共要走25步,每步都上两个台阶,所得结果为:

    综上,把所有情况的累加就是最终答案

规律总结

通过以上分析可得出,如果总台阶数为num,则走法的数量为:

代码实现

创建一个名为Steps的类

num :总台阶数
ok :初始值为0,判断能否约分
getOptions() :获得所有走法的总数量
getUp() : 获得分母
getD() : 获得分子

关键:
因数据过大,主要要解决数据溢出问题,故想办法将数据变小,有两个方面可以减小数据

  1. 约分,在计算分母的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行)

  2. 利用排列组合的对称性可得到该公式

    当不等式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:发这篇文章主要是记录记录自己的想法,如果说的有什么不对的地方欢迎大家指正。
初次入坑,请各位大佬多多指教

上台阶问题——利用高中排列组合知识相关推荐

  1. 突发奇想想用C解决高中排列组合问题

    题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 很简单的一道高中题目,用程序来也是很好实现的.话不多说,直接上代码. #include<stdio.h> ...

  2. C语言山行组合数,高中排列组合基础题-(含答案).doc

    排列.组合问题基本题型及解法 同学们在学习排列.组合的过程中,总觉得抽象,解法灵活,不容易掌握.然而排列.组合问题又是历年高考必考的题目.本文将总结常见的类型及相应的解法. 一.相邻问题"捆 ...

  3. P3223 [HNOI2012]排队(高中排列组合)

    传送门 题意 nnn个男生,mmm个女生,222个老师排队 女生和女生不能相邻,老师和老师不能相邻,问方案数. 考虑到老师只有两个,所以可以对老师来讨论. Ⅰ.\color{Red}Ⅰ.Ⅰ.两只老师间 ...

  4. 组合数学-排列组合整理

    此文是我整理组合数学排列组合知识的博文,排列组合从零开始...加油! 1.重复组合: 从n种不同元素中取出m的元素(方法是从n个元素中每次取出一个后,放回,再取另外一个,直到取出m个元素),每一种元素 ...

  5. 计算组合数c语言ac,AC排列组合

    一共6个人里选2个,C=15 [排列组合]什么时候用排列,什么时候用组合?二者差别在哪里 一组数里的元素次序颠倒不要紧的时候Yong组合,颠倒算第二种情况的用排列. 就是说假如用abcdefg中的5G ...

  6. C语言利用循环方法实现排列组合

    排列组合是我们高中时期就学过的知识,还记得当初被甲乙丙丁们站在一排的数学问题所折磨,苦不堪言呐.在实际编程过程中,我们也常遇到排列组合的问题. 那么,什么是排列组合呢?百度百科给的解释通俗易懂.排列组 ...

  7. 利用排列组合公式Cnm输出杨辉三角(C语言实现)

    二项式定理与杨辉三角联系十分紧密.杨辉三角的第 n 行的第 m(设m从0开始数) 个数即 n 次二项式展开的第 m 个系数,因此杨辉三角某行某列上的数都可以通过二项式定理的系数来得知,计算n次二项式展 ...

  8. 学习笔记---高等数学前置知识---数列、排列组合、解不等式

    数列 等差(a1即首项,d即公差,n即项数) 通项公式: 前n项和公式:或 等比(a1即首项,q即公比,n即项数) 通项公式: 求和公式: 附: 裂项公式: 常在计算数列和时用于裂项相消法 例: 1/ ...

  9. 自编高中数学---排列组合公式推导

    知乎一个竞赛生写的排列组合文章:https://www.zhihu.com/question/26094736 一.排列 ,Permutaion 把n件东西往m个位置里排序,有多少种排法? 记排列方法 ...

最新文章

  1. 干货|2020年以后人工智能的几点思考
  2. ScrollView嵌套ListView处理事件冲突
  3. android 状态机的作用,Android 状态机、状态模式 基础框架实现
  4. DHCP数据抓包分析--wireshark
  5. vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项
  6. 纸板怎么切割光滑_激光切割机大PK!光纤、CO2、YAG,你选谁?!
  7. 1.1.0-简介-P11-分布式锁的解决方案
  8. 性能测试之JMeter配置元件【计数器】
  9. 常见的网页布局(HTML、CSS)
  10. 使用k-近邻算法改进约会网站的配对效果
  11. Charles for Mac(抓包工具)
  12. 20170403_Windows网络编程视频学习1
  13. 深信服 云桌面 linux,深信服桌面云-深信服桌面云下载 v3.0官方版--pc6下载站
  14. 通俗易懂的虚短、虚断的使用条件?
  15. WinHex的使用指南(图文详细版)
  16. 咪咕音乐HTML代码,python3爬取咪咕音乐榜信息(附源代码)
  17. c++ Dxgi+FFmpeg 完成对截图屏幕,以及将屏幕数据保存为MP4格式,以完成录屏功能
  18. 基于Android手机酒店客房预订系统
  19. 边境的悍匪—机器学习实战:第五章 支持向量机
  20. Oracle安装步骤(记录)

热门文章

  1. linux 宝塔 卸载mysql_宝塔面板(linux)卸载的一些方法的整理以及卸载之后一些文件的删除...
  2. FL Studio最新20.9中文版DJ电子音乐制作神器
  3. 一文读懂大唐杯所有名词解释
  4. @Autowired注入、构造器注入、setter注入的使用方式?区别?
  5. 【星云测试】Wings-让单元测试智能全自动生成
  6. i春秋-密码-IceCTF-Alien Message
  7. 苹果计算机单位说明书,手把手教你用苹果电脑玩转办公
  8. (秋招/春招)软件开发/软件测试面试题——计算机网络部分
  9. 英伟达 (Nvidia) GPU 系统管理界面(SMI)
  10. 英伟达帝国的一道裂缝