爬台阶:每步只能走一或两个台阶,求爬到n个台阶共有多少种走法

Self_bsbdqj 2012-12-29 04:58:31
比如爬到第3个台阶有3种方法,一种是1+2这样走,一种是2+1这样走,一种是1+1+1这样走。
用斐波那契解出来了,但用组合时运行到第39个台阶时就开始出错了,前面38个都对且用longlong型。。。求大牛解救
下面是用排列组合方法的代码:(先输入一个数表示有多少组测试数据)

#include <stdio.h>
int main()
{
int n,n2,t,i,j,k,h,count;
long long int a,sum = 0,mul;

scanf("%d",&t);
for (i = 0; i < t; i++)
{
scanf("%d",&n);
n2 = n;
count = n / 2;

if (n2 <= 3)
printf("%d\n",n2);
else
{
for (j = 1; j <= count; j++)
{
mul = a = 1;
n2--;
n = n2+1;
for (k = 1; k <= j; k++,n--)
mul *= (n - 1);
for (h = 1; h <= j; h++)
a *= h;
sum += mul / a;
}
printf("%lld\n",sum+1);
sum = 0;
}
}
return 0;
}
...全文
2907 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-03-07
  • 打赏
  • 举报
回复
仅供参考:
// 某人攀登天梯,有时一步上1级,有时一步上2级,高兴了还一步跨上3级。
// 现在求登上n级阶梯,共有多少种不同的走法?
// 1级阶梯,只有1种走法。
// 2级阶梯,2种走法,可以每步上1级,也可以一步上2级。
// 3级阶梯有4种走法。可以每步上1级;可以先上1级再一步上2级;可以先一步上2级再上1级;可以一步上3级。
// 4级阶梯共7种走法。可以先上1级,在第1级基础上再向上走3级,有4种走法;可以先一步上2级,在第2级基础上再向上走2级,有2种走法;可以先一步上3级,在第3级基础上再向上走1级,有1种走法。
// ……
// n级阶梯共有m种走法。因为可以先上n-3级,在第n-3级基础上再向上一步走3级;可以先上n-2级,在第n-2级基础上再向上一步走2级;可以先上n-1级,在第n-1级基础上再向上一步走1级。
//
// 输入样例: 输入:4     输出:7
//
//          输入:10    输出274
#include <iostream>
long long num[73];
int main(){
    int i, n;
    for (num[0] = num[1] = 1, num[2] = 2, i = 3; i < 73; ++i)
        num[i] = num[i-1] + num[i-2] + num[i-3];
    while(std::cin >> n) std::cout<<num[n]<<std::endl;
    return 0;
}
Beinggeeks 2015-03-07
  • 打赏
  • 举报
回复
数学问题,不是编程的问题
houguobo 2015-03-07
  • 打赏
  • 举报
回复
2L的代码是错误的!
houguobo 2015-03-07
  • 打赏
  • 举报
回复
这时一个斐波那契数列
szulee 2012-12-29
  • 打赏
  • 举报
回复
引用 5 楼 Self_bsbdqj 的回复:
我去~各位没看懂题目么,知道你们大大啦。。不屑一顾啦。。 我要的是 【求指正】 懂么??????????????????????????????????
抱歉 你的帖子主题有 “求指正” 这三个字么。 没看到。? 你的代码一点注释也没有。 排版成这样。让谁帮你看。
Self_bsbdqj 2012-12-29
  • 打赏
  • 举报
回复
我去~各位没看懂题目么,知道你们大大啦。。不屑一顾啦。。 我要的是 【求指正】 懂么??????????????????????????????????
zhcosin 2012-12-29
  • 打赏
  • 举报
回复
这是数学问题,不是编程的问题。
Self_bsbdqj 2012-12-29
  • 打赏
  • 举报
回复
只求改正。。。不必贴自己写的代码。。
szulee 2012-12-29
  • 打赏
  • 举报
回复
#include <stdio.h>

/*参数1表示有几步一阶*/
/*参数2表示有几步二阶*/
/*函数返回总共有几种情况*/
int getSumWay(int oneStepNum,  int twoStepNum)
{
	if(twoStepNum ==0 || oneStepNum==0)
		return 1;
	
	int result = 0;
	for(int i=0; i<twoStepNum;i++)
		result  += (oneStepNum+1 - i);
	return result;
}

/*参数ladderNum表示总共几阶*/
/*函数遍历所有一阶二阶的情况*/
void inputLadderNum(int ladderNum)
{
	int sumWay = 0;
	int oneStepNum = ladderNum;
	int twoStepNum=0;
	
	while(twoStepNum*2 <= ladderNum)
		{
			sumWay +=getSumWay(oneStepNum,twoStepNum);
			oneStepNum-=2;
			twoStepNum+=1;
		}
	printf("共有%d 种方法\n",sumWay);
}

int main()
{
	inputLadderNum(10);
}
稍微动手写了下。 应该算是穷举法吧。 getSumWay的实现不确定有没误
  • 打赏
  • 举报
回复
笔算即可,丫的字数不够么

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧