NowCoder小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。
但年幼的他一次只能走上一阶或者一下子蹦上两阶。
现在一共有N阶台阶,请你计算一下NowCoder从第0阶到第N阶共有几种走法。
输入包括多组数据。每组数据包括一个整数n, (1≤n≤90)。
对应每个输入包括一个输出。
为redraiment到达第n阶不同走法的数量。
1<br/>2
1<br/>2
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]); } }}
详细解释
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
为什么超时啊!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; }