首页 > 试题广场 >

计算斐波那契数最小差值

[编程题]计算斐波那契数最小差值
  • 热度指数:2899 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个整数 n ,计算 n 与斐波那契数的最小差值(绝对值)

说明:
斐波那契数定义:
从0,1开始后面的数值为前面两者之和, 即第三个数为第一和第二个数之和
形如:0,1,1,2,3,5,8,13,21。。。。  其中3为1与2的和,5为2与3的和,8为3与5的和等等
要计算的数值案例:
输入15,与斐波那契数相减,与13相减的绝对值是2,与21相减的绝对值是6,与众多斐波那契数相减的最小差值为2
因此输入15,输出2

数据范围:输入的数满足





输入描述:
输入任意整数


输出描述:
一个整数
示例1

输入

15

输出

2

说明

15与“0,1,1,2,3,5,8,13,21。。。。”当中的13差值的绝对值最小,与21的差值为6,与8的差值为7  
示例2

输入

1

输出

0

说明

斐波那契数列中存在 1 ,因此最小差值是 0  
简单的动态规划问题
import java.util.Scanner;

/**
 * @Author: coderjjp
 * @Date: 2020-05-10 9:16
 * @Description: 计算斐波那契数最小差值
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        //当n > 5 是dp[n] > n;
        if (n == 4)
            System.out.println(1);
        else if (n <= 5)
            System.out.println(0);
        else {
            int temp0 = 0;
            int temp1 = 1;
            for (int i = 2; i <=n; i++){
                temp1 = temp1 + temp0;
                temp0 = temp1 - temp0;
                if (temp1 > n){
                    System.out.println(Math.min(temp1 - n, n - temp0));
                    return;
                }
            }
        }
    }
}


发表于 2020-05-10 09:32:03 回复(0)
13ms,9308k
/*
与他最接近的两个斐波那契数,计算差值,找最小
*/
import java.io.*;
public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader( new InputStreamReader( System.in ));
        int n = Integer.parseInt(br.readLine());
        int min,k=0,max;//k用来记录斐波那契数的下标
        while(true){
            int temp = ***);
            if(***) <= n && ***+1) >= n){
                min = ***);
                max = ***+1);
                break;
            }else
                k++;
        }
        System.out.println(Math.abs(min-n)>Math.abs(max-n)?Math.abs(max-n):Math.abs(min-n));
    }
    
    public static int Fuc(int index){
        if(index == 0)
            return 0;
        if(index == 1)
            return 1;
        return Fuc(index-1)+Fuc(index-2);
    }
}


编辑于 2020-05-05 15:48:45 回复(0)
import java.util.Scanner;
import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int temp1 = 0;
        int temp2 = 1;
        int temp3 = 1;
        int ans = -1;
        while(temp3 < x){
            temp3 = temp1 + temp2;
            temp1 = temp2;
            temp2 = temp3;
        }
        ans = (x - temp1) > (temp3 - x) ? (temp3 - x) : (x - temp1);
        System.out.println(ans);
    }
}

发表于 2020-03-04 15:53:53 回复(2)
Java解法 动态规划
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    /**
     * 运行时间:48ms
     *
     * 占用内存:10568k
     * */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        ArrayList<Integer> record = new ArrayList<>();
        record.add(0);
        record.add(1);
        int i=2;
        while (true){
            record.add(record.get(i-1)+record.get(i-2));
            if (record.get(i)>=n)
                break;
            i++;
        }
        if (n==0||n==1||n==2){
            System.out.println(0);
        }else {
            System.out.println(Math.min(Math.abs(record.get(i)-n),Math.abs(record.get(i-1)-n)));
        }
    }
}


发表于 2020-03-01 13:47:57 回复(0)
  • 方法有点蠢,就是不停地创建斐波那契数列数组,因为这是一个无穷数列,所以数组的大小一直在改变。

  • 比如说我想获取数列中的第8个数时多少,那么就要创建一个长度为8的数组(斐波那契数列)。

  • 根据题目中的示例,可以知道15是夹在13和21之间的,也就是13=<15<=21,写个循环,只要满足这个条件(大于等于数列中前一个数并且小于等于后一个数),就开始作差,把最小的一个数返回即可。

    import java.util.*;
    public class Main
    {
       public static void main(String [] args)
       {
           Scanner sc=new Scanner(System.in);
           while(sc.hasNextInt())
           {
               int n=sc.nextInt();
               System.out.println(getMin(n));
           }
       }
    
       private static int getMin(int num)
       {
           int min=0;
           for(int i=0;;i++) 
           {
               if(num>=getNum(i)&&num<=getNum(i+1))
               {
                   int a=Math.abs(num-getNum(i));
                   int b=Math.abs(num-getNum(i+1));
                   min=a<b?a:b;
                   break;//退出循环
               }         
           }
           return min;          
       }
    
       private static int getNum(int index)//获取索引为几的数
       {
           int [] array=new int[index+1];
           if(array.length>2)
           {
               array[0]=0;
               array[1]=1;
               for(int i=2;i<array.length;i++)
               {
                   array[i]=array[i-1]+array[i-2];
               }
           }
           else if(array.length==2)
           {
                array[0]=0;
                array[1]=1;
           }
           else if(array.length==1)
           {
                array[0]=0;
           }
    
           return array[index];      
       }  
    }
发表于 2020-02-16 12:11:52 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] a){
        int n=new Scanner(System.in).nextInt();
        ArrayList<Integer> list=new ArrayList();
        for(int i=1;i<=n;i++){
            Integer num=i<=2?1:list.get(i-2)+list.get(i-3);
            list.add(num);
        }
        int cha=n;
        for(int i=0;i<n;i++){
            int abs=Math.abs(list.get(i)-n);
            if(abs<cha)
                cha=abs;
        }
        System.out.print(cha);
    }
}

发表于 2019-10-18 17:46:46 回复(0)