列表

详情


KS28. 计算斐波那契数最小差值

描述

给定一个整数 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

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 292KB, 提交时间: 2021-09-17

#include <stdio.h>

int main() {

    int n;
    int bigNum = 1;
    int smallNum = 0;
    int firstNum = 0;
    int secondeNum = 1;
    scanf("%d", &n);
    
    while(firstNum+secondeNum < n){
        smallNum = firstNum + secondeNum;
        firstNum = secondeNum;
        secondeNum = smallNum;
    }
    bigNum = firstNum + secondeNum;
    if (n-smallNum > bigNum-n) {
        printf("%d", bigNum-n);
    } else {
        printf("%d", n-smallNum);
    }

}

C 解法, 执行用时: 2ms, 内存消耗: 308KB, 提交时间: 2022-04-13

#include<stdio.h>
int main()
{
    int a=0;
    int b=1;
    int c=0;
    int n;
    scanf("%d",&n);
    while(1)
    {
        if(n==c)
        {
            printf("%d",0);
            break;
        }
        if(n<=b)
        {
        if(abs(a-n)<abs(b-n))
        {
            printf("%d",abs(a-n));
            break;
        }
            else
            {
                printf("%d",abs(b-n));
                break;
            }
        }
        a=b;
        b=c;
        c=a+b;
    }
    return 0;
}

上一题