/*
对于这样的题目主要是抓住递推式的关系。
我对于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;
}