首页 > 试题广场 >

求数列第n项

[编程题]求数列第n项
  • 热度指数:3825 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
米兔从兔米那里了解到有一个无限长的数字序列 1,  2,3,3,4,4,4,  5,5,5,5,5 ...,(已知此数列有一定规律,现将这些数字按不同数值堆叠,相同值的数字在同一层)。米兔想知道这个数字序列的第n个数所在的那一层之前的所有层里共有多少个数。

输入描述:
n(n<=1e18)


输出描述:
第n个数所在的那一层之前的所有层里共有多少个数
示例1

输入

6

输出

4
  • 测试用例的数比较大,不能用int型,要用long
  • 对斐波那契数列进行累加求和sum,如果这个和sum大于等于输入的n,记录此时的索引i,这个索引i就是n所在的层数。然后遍历第1层到n-1层,累加求和,就是最终结果。
import java.util.*;
public class Main
{
    public static void main(String [] args)
    {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNextLong())
        {
            long n=sc.nextLong();
            long sum=0;
            long index=0;//第n个数所处的层数
            for(long i=1;;i++)
            {
                sum+=fib(i);
                if(sum>=n)//假如说累加和大于等于n了,说明此时的i就是第n个数所处的行数
                {
                    index=i;
                    break;
                }
            }
            long before=index-1;
            long s=0;
            for(long i=1;i<=before;i++)
            {
                s+=fib(i);
            }
            System.out.println(s);

        }

    }

    private static long fib(long n)//斐波那契函数
    {
        long a=1;
        long b=1;
        for(long i=1;i<n-1;i++)
        {
            b=a+b;
            a=b-a;
        }
        return b;
    }
}
发表于 2020-03-28 11:19:18 回复(0)