/* 对于这样的题目主要是抓住递推式的关系。 我对于F(n)=F(n-1)+1*F(n-2)的公式理解是这样的。F(n-1)代表昨天的兔子总量。 F(n-2)代表前天的兔子总量,刚好只有前天的兔子具有生产能力。 所以如果题目改成一只成熟的兔子能够生产2只,那么通项公式为F(n)=F(n-1)+2*F(n-2) 先预处理一个数组,这样对于多组测试数据就可以节约一点时间。 */ #include<stdio.h> int main() { __int64 a[95]={1,2}; int n,i; for(i=2;i<91;i++) a[i]=a[i-1]+a[i-2]; while(scanf("%d",&n)!=EOF) { printf("%I64d\n",a[n-1]); } return 0; }
#include <stdlib.h> #include <stdio.h> int main(){ int n; long long a[91]; a[1]=1; a[2]=2; int min=2; while((scanf("%d",&n))!=EOF){ if(n>min){//动态扩展,根据输入数据的值动态扩展数据,没用到的大数据就不计算了,而每一次调用过后又将把数据保存下来,下次需要的数据就不必重新计算了。 for(int i=min+1;i<=n;i++){ a[i]=a[i-1]+a[i-2]; } min=n; } printf("%lld\n",a[n]); } return 0; }
import java.math.BigInteger; import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); BigInteger oldRabbit=new BigInteger("1"); BigInteger newRabbit=new BigInteger("0"); for(int i=0;i<n-1;i++){ BigInteger temp=newRabbit; newRabbit=oldRabbit; oldRabbit=oldRabbit.add(temp); } System.out.println(oldRabbit.add(newRabbit)); } } }
//就是斐波那契数列 import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); long[] arr = new long[91]; arr[1] = 1; arr[2] = 2; for(int i = 3;i < arr.length;i++){ arr[i] = arr[i-1] + arr[i-2]; } System.out.println(arr[n]); } } }
// write your code here import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); long f0 = 1; long f1 = 1; //斐波拉契数列 f[i]=f[i-1]+f[i-2] long f = 1; while (n - 1 > 0) { f = f0 + f1; f0 = f1; f1 = f; n--; } System.out.println(f); } } }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); long[] dp = new long[n+2]; dp[1] = 1; dp[2] = 2; for(int i = 3; i < n+1;i++){ dp[i] = dp[i-1] + dp[i-2]; } System.out.println(dp[n]); } } }
import java.util.*; public class Main{ public static long[] arr = new long[91]; public static void fun(){ arr[0] = 1; arr[1] = 1; arr[2] = 0; for(int i = 2;i < arr.length;i++){ arr[i] = arr[i - 1] +arr[ i - 2]; } } // public static void main(String[] args){ // Scanner sc = new Scanner(System.in); // while(sc.hasNext()){ // int n = sc.nextInt(); // fun(); // System.out.println(arr[n]); // } // } //方法二: public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); long f0 = 1; long f1 = 1; long f2 = 1; for(int i = 2;i <= n;i++){ f2 = f1 +f0; f0 = f1; f1 = f2; } System.out.println(f2); } } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ int n = scanner.nextInt(); long ans = Fibnaqi(n); System.out.println(ans); } } public static long Fibnaqi(int n){ if(n == 1 || n == 2){ return n; } long ans = 0; long a = 1; long b = 2; while(n > 2){ ans = a + b; a = b; b = ans; n--; } return ans; } }
// 本质:斐波那契数列的考察 // 注意数据类型long long #include <iostream> #include <vector> using namespace std; int main() { int n; while(cin >> n) { vector<long long> v(91, 0); v[1] = 1; v[2] = 2; for(int i = 3; i < 92; i++) v[i] = v[i - 2] + v[i - 1]; cout << v[n] << endl; } return 0; }
就是一个斐波那契数列的第n项的数字的问题,不过这里考的就是数据类型的大小的知识点
#include <iostream> #include <vector> using namespace std; int main() { vector<long> v{ 1,1,2 }; for (int i = 3; i <= 90; i++) v.push_back(v[i - 1] + v[i - 2]); int n = 0; while (cin >> n) cout << v[n] << endl; return 0; }
#include <iostream> ////1 1+0 ////2 1+1 ////3 2+1 ////4 3+2 ////5 5+3 using namespace std; int main(){ int n; long long a[100]; a[1]=1; a[2]=2; while(cin>>n){ for(int i=3;i<=n;i++){ a[i]=a[i-1]+a[i-2]; } cout<<a[n]<<endl; } }
//斐波那契数列 // write your code here cpp #include<iostream> #include<vector> using namespace std; int main() { int n; vector<long> arr{1,2}; while(cin>>n) { if(n>arr.size()) for(int i=arr.size();i<=n;++i) arr.push_back(arr[arr.size()-1]+arr[arr.size()-2]); cout<<arr[n-1]<<endl; } return 0; }
//Fibonacci数列 #include <stdio.h> #include <stdlib.h> int main() { int n; long long int fib[90] = {1, 2}; while(~scanf("%d", &n)) { if(fib[n-1] == 0) { for(int i = 2; i < n; i++) { fib[i] = fib[i-1] + fib[i-2]; } } printf("%ld\n", fib[n-1]); } }一开始我直接用递归结果超时,然后就取消使用递归栈,直接用size为90的数组,每输入一个n就补充一下fib数组,然后就可以了
时间 | 成熟(可繁殖) | 幼年(出生) | 总数 |
第1天 | 1 | 0 | 1 |
第2天 | 1 | 1 | 2 |
第3天 | 2 | 1 | 3 |
第4天 | 3 | 2 | 5 |
第5天 | 5 | 3 | 8 |
第6天 | 8 | 5 | 13 |
#include <iostream> using namespace std; int main(int argc, const char * argv[]) { int number = 0; //scanf返回值为正确输出数据的变量个数,当一个变量都没有 //获取到数据时,此时返回-1 while (scanf("%d", &number) != - 1) { if (number < 4) { //计算可知第一天1只,第2天2只,第3天3只 printf("%d\n", number); } else { //递推第i(i ≥ 4)天的兔子f(i) = f(i - 1) + f(i - 2) long long before = 2, now = 3, next = 0; for (int i = 4; i <= number; ++i) { //f(i) = f(i - 1) + f(i - 2) next = before + now; //更新f(i - 2) = f(i - 1), f(i - 1) = f(i) before = now; now = next; } printf("%lld\n", now); } } return 0; }