搜索
查看: 1294|回复: 5
打印 上一主题 下一主题

小明爬楼梯的那个挑战。哪里错了。。

[复制链接]
跳转到指定楼层
楼主
发表于 2014-1-24 11:06:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b,c,d,e,f,g,h;
    a=1;b=2;c=3;
    h=0;
    d=a*e+b*f+c*g;
    for(e=0;e<=36;e++)
    for(f=0;f<=18;f++)
    for(g=0;g<=12;g++)
    while(d==36)
    h++;
    printf("%d",h);
        system("pause");
        return 0;
}

沙发
发表于 2014-1-24 13:13:51 | 只看该作者
本帖最后由 981013 于 2014-1-24 13:18 编辑

楼主的算法完全看不懂想干嘛……{:soso_e127:}
说一下我的算法:
首先,由已知可得:
第一级台阶有1种爬法
第二级台阶有2种爬法:1,1(即先爬1层,再爬1层)或2(即直接爬两层)
第三级台阶有4种爬法:1,1,1或1,2或2,1或3
然后可以由题目所给条件推得,登上第n级台阶有如下三种方法:

  • 从第n-1级台阶爬1层登上
  • 从第n-2级台阶爬2层登上
  • 从第n-3级台阶爬3层登上
因此可得出:
设有一数组a[36],其中a[n]的值代表登上第n层的方法数(0≤n≤35且n∈Z)
则:a[0]=1,a[1]=2,a[2]=4
a[n]=a[n-1]+a[n-2]+a[n-3](3≤n≤35)
在用C语言实现该算法后,提取a[35]的值即为所求值。

注意最后结果非常大,用int甚至long型变量都储存不了,可以用long long型变量,long long型变量的格式控制符是%lld(至少gcc(啊哈C内核)中是这样)
板凳
发表于 2014-1-24 17:04:20 | 只看该作者
981013 发表于 2014-1-24 13:13
楼主的算法完全看不懂想干嘛……
说一下我的算法:
首先,由已知可得:

这个结果用int用long都能放得下
long long的占位符在啊哈C中是%I64d,这取决于libc,而不是负责生成代码的编译器
地板
发表于 2014-1-26 23:49:12 | 只看该作者
先不说算法,说说程序本身的问题:
你在第8行为d赋值,可是此时e, f, g 根本没有值,你让计算机怎么算?
要让程序能执行,那得把这一句移到11与12行中间,也就是变成这样:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int a,b,c,d,e,f,g,h;
  6.     a=1;b=2;c=3;
  7.     h=0;
  8.     for(e=0;e<=36;e++)
  9.     for(f=0;f<=18;f++)
  10.     for(g=0;g<=12;g++) {
  11.         d=a*e+b*f+c*g;
  12.         while(d==36)
  13.             h++;
  14.     }
  15.     printf("%d",h);
  16.     system("pause");
  17.     return 0;
  18. }
复制代码

然后再说算法的问题:你这样计算只能算出每步1、2、3级爬36级台阶的组合数,而每一个组合中还有若干的排列(也就是爬法)。沙发给出的算法是比较简单直观的:爬到第n级的方法是爬到第n-3级、第n-2级、第n-1级的方法之和。给你列个表,就更清楚了。

台阶数 爬法
1
2
3
4
5
...
1
2
4
7=1+2+4
13=2+4+7
...
5#
发表于 2014-1-30 10:25:21 | 只看该作者
LZ   的思路和我以前的一样
6#
发表于 2014-2-3 20:26:25 | 只看该作者
"d = a * e + b * f + c * g;"这句的e、f、g都没有初始化(或许是位置错了)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表