NowCoder小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。
但年幼的他一次只能走上一阶或者一下子蹦上两阶。
现在一共有N阶台阶,请你计算一下NowCoder从第0阶到第N阶共有几种走法。
输入包括多组数据。每组数据包括一个整数n, (1≤n≤90)。
对应每个输入包括一个输出。
为redraiment到达第n阶不同走法的数量。
1<br/>2
1<br/>2
详细解释
https://blog.csdn.net/qq_33375598/article/details/104608324
设f(n)为青蛙从0到n台阶的方案数,
当f(1) = 1,f(2) = 2;
当n为3时,
当n为4时,
于是发现递推式为f(n) = f(n-1)+f(n-2)。也就是斐波那契数列。
/*
* 详解:https://blog.csdn.net/qq_33375598/article/details/104608324
*/
#include <cstdio>
typedef long long ll;
const int MAXN = 91;
ll f[MAXN] = {1,1,2};
int main(int argc, char const *argv[]){
int n;
for (int i = 3; i <= 90; ++i) {
f[i] = f[i -1] + f[i -2];
}
while(scanf("%d", &n) != EOF){
printf("%lld\n", f[n]);
}
return 0;
}
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
BigInteger[] steps=new BigInteger[95];
steps[1]=new BigInteger("1");
steps[2]=new BigInteger("2");
for(int i=3;i<95;i++){
steps[i]=steps[i-1].add(steps[i-2]);
}
while(sc.hasNext()){
int n=sc.nextInt();
System.out.println(steps[n]);
}
}
}
思路看见这种题目头疼 母牛题目改编。
#include <iostream>
#include <vector>
using namespace std;
/*
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
*/
int main()
{
vector<long long> v(90);
long long temp;
v[0] = 1;// D
v[1] = 2;// D A
v[2] = 3;// D A B
v[3] = 5;// D A B C
for (int i = 4; i < 90; i++)
{
v[i] = v[i - 1] + v[i - 2];
}
int n;
while (cin >> n)
{
cout << v[n - 1] << endl;
}
}
def redra(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
if ***.get(n)!=None:
return ***[n]
else:
newSum = redra(n-1) + redra(n-2)
***[n] = newSum
return newSum
*** = {1:1, 2:2}
while True:
try:
n = int(input())
except:
break
print(redra(n)) Python using memoization and recursion
publicclassMain { /* * 青蛙跳台阶 斐波那契数列 * 规律:1 2 3 5 8 ... */ publicstaticvoidmain(String[] args) { long[] lArr = newlong[91]; lArr[1] = 1; lArr[2] = 2; for(inti = 3; i < lArr.length; i++) lArr[i] = lArr[i - 1] + lArr[i - 2]; Scanner in = newScanner(System.in); while(in.hasNextInt()) { intn = in.nextInt(); System.out.println(lArr[n]); } }}
为什么超时啊!JAVA提交总是超时😓 import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
System.out.println(work(n));
}
}
/*
* 递归实现
* */
public static int work(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
return work(n-1)+work(n-2);
}
} 解题思路: 这题比较经典,是斐波拉契尔数列的包装。 由于只能一次上1阶台阶或者一次2阶台阶, 因此可以从第n - 2阶台阶直接上2阶到达第n阶,也可以从 第n - 1阶台阶上1阶台阶到达第n阶, 因此可得出结论f(n) = f(n - 1) + f(n - 2)(n ≥ 2) 代码实现:\color{blue}代码实现:代码实现: #include <iostream> using namespace std; int main(int argc, const char * argv[]) { //建立一张表,用于记录f(n)各项值,注意数据溢出,使用long long型 long long fTable[91] = {0, 1, 2}; for (int i = 3; i < 91; ++i) { fTable[i] = fTable[i - 1] + fTable[i - 2]; } int number = 0; //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1 while (scanf("%d", &number) != - 1) { printf("%lld\n", fTable[number]); } return 0; }————————————————
//又是斐波那契数列...
#include <stdio.h>
#include <stdlib.h>
long long int fib[90] = {1, 2, 3, 5, 8};
int main()
{
int n;
int start = 5;
while(~scanf("%d", &n))
{
if(n > start)
{
for(int i = start; i < n; i++)
fib[i] = fib[i-1] + fib[i-2];
start = n;
}
printf("%ld\n", fib[n-1]);
}
} #include<iostream>
#include<vector>
using namespace std;
//典型fb数列
int main() {
int n;
vector<long long> dp(91,0);
dp[0]=1;
dp[1]=1;
for (int i = 2; i < 91; i++) {
dp[i]=dp[i-1]+dp[i-2];
}
while (cin >> n) {
cout << dp[n] << endl;
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
long[] a=new long[92];
a[1]=1;
a[2]=2;
for(int i=3;i<a.length;i++)
a[i]=a[i-1]+a[i-2];
while(sc.hasNext()){
int c=sc.nextInt();
System.out.println(a[c]);
}
}
}
<?php
while(fscanf(STDIN, "%d", $a))
echo (fib($a))."\n";
function fib($n){
$data=array();
$data[0]=1;
$data[1]=2;
for ($i=3;$i<=$n;$i++){
$data[$i-1]=$data[$i-2]+$data[$i-3];
}
return $data[$n-1];
}
def c(m,n): con1,con2,re=1,1,0 for i in range(n,n-m,-1): con1 = con1*i for i in range(1,m+1): con2 = con2*i re = con1//con2 return re try: while True: n = input() n = int(n) res = 0 num2 = [] for i in range(1,n//2+1): num2.append(i) num1 = [] for i in num2: num1.append(n-i*2) for i in range(0,len(num2)): res = res + c(num2[i],num1[i]+num2[i]) res+=1 print(res) except: pass
#include <bits/stdc++.h>
#define PI 3.1415927
using namespace std;
typedef unsigned long long ll;
ll arr[1000005];
void init()
{
arr[1]=1;
arr[2]=2;
for(int i=3;i<=90;i++)
arr[i]=arr[i-1]+arr[i-2];
}
int main(void)
{
init();
int n;
while(cin>>n)
cout<<arr[n]<<endl;
return 0;
}