Java 为下面的程序编写有效的代码?

Java 为下面的程序编写有效的代码?,java,Java,我想检查12位数字是否属于斐波那契数列。我写了下面的代码,但它似乎不够有效,我遇到了超时错误。如何优化我的代码 Scanner sc=new Scanner(System.in); List<Long> test_list=new ArrayList<>(); List<String> final_list=new ArrayList<>(); long cases=sc.nextLong(); for(i

我想检查12位数字是否属于斐波那契数列。我写了下面的代码,但它似乎不够有效,我遇到了超时错误。如何优化我的代码

    Scanner sc=new Scanner(System.in);
    List<Long> test_list=new ArrayList<>();
    List<String> final_list=new ArrayList<>();
    long cases=sc.nextLong();

    for(int i=0;i<cases;i++)
    {
        long input=sc.nextLong();
        test_list.add(input);
    }

    for(int j=0;j<test_list.size();j++)
    {
        long check_number=test_list.get(j);
        long a=0l,b=1l,c=0l;
        while(c<check_number)
        {
            c=a+b;
            a=b;
            b=c;
        }
        if(c == check_number)
        {
            final_list.add("IsFibo");
        }
        else
        {
            final_list.add("IsNotFibo");
        }

    }

    for(String s:final_list)
    {
        System.out.println(s);
    }
Scanner sc=新扫描仪(System.in);
List test_List=new ArrayList();
List final_List=new ArrayList();
长案例=sc.nextLong();

对于(int i=0;i您可以这样做:

    Scanner sc = new Scanner(System.in);
    List<Long> fibonaci = new ArrayList<Long>(); // Added to store already calculated fibo number
    fibonaci.add(0L);
    fibonaci.add(1L);

    List<Long> test_list = new ArrayList<>();
    List<String> final_list = new ArrayList<>();
    long cases = sc.nextLong();

    for (int i = 0; i < cases; i++) {
        long input = sc.nextLong();
        test_list.add(input);
    }

    for (int j = 0; j < test_list.size(); j++) {
        long check_number = test_list.get(j);
        long a = fibonaci.get(fibonaci.size()-2), b = fibonaci.get(fibonaci.size() - 1), c = 0l;
        if (check_number > b) { //To Check whether last number in fibo is less than input

            while (c < check_number) {
                c = a + b;
                fibonaci.add(c);
                a = b;
                b = c;
            }
        }
        if (c == check_number || fibonaci.contains(check_number)) {
            final_list.add("IsFibo");
        } else {
            final_list.add("IsNotFibo");
        }

    }
    for (String s : final_list) {
        System.out.println(s);
    }
Scanner sc=新扫描仪(System.in);
List fibonaci=new ArrayList();//已添加到已计算的fibo号存储中
fibonaci.添加(0升);
斐波那契。添加(1L);
List test_List=new ArrayList();
List final_List=new ArrayList();
长案例=sc.nextLong();
对于(int i=0;ib){//检查fibo中的最后一个数字是否小于输入值
而(c<检查编号){
c=a+b;
加上(c);
a=b;
b=c;
}
}
如果(c==检查编号| | fibonaci.contains(检查编号)){
最终清单。添加(“IsFibo”);
}否则{
最终清单。添加(“IsNotFibo”);
}
}
用于(字符串s:最终列表){
系统输出打印项次;
}
我所做的:

  • 用一个额外的列表存储已计算的fibonaci编号
  • 检查输入是否大于上次计算的斐波那契数
  • 如果是,则计算下一个斐波那契数,直到输入小于斐波那契数
  • 如果否,则检查您的数字是否存在于斐波那契列表中

    • 12位斐波那契数的简易硬编码解决方案

      long f55 = 139583862445L;
      long f56 = 225851433717L;
      long f57 = 365435296162L;
      long f58 = 591286729879L;
      long f59 = 956722026041L;    
      
      for(int j=0;j<test_list.size();j++)
          {
              long n=test_list.get(j);
      
      
              if(n == f55 || n == f56 || n == f57 || n == f58 || n == f59)
              {
                  final_list.add("IsFibo");
              }
              else
              {
                  final_list.add("IsNotFibo");
              }
      
          }
      
      长f55=139583862445L;
      长f56=22585143717L;
      长f57=365435296162L;
      长f58=591286729879L;
      长f59=956722026041L;
      
      对于(int j=0;j@DharmeshPorwal他用谷歌搜索了什么?我想不出谷歌搜索会有什么帮助。你能吗?你试过了吗?你为什么每次都要计算斐波那契数列?你知道数字是12位数,你可以硬编码数值?只计算一次,保留一个本地缓存?@ajb a sort
      n log(n)
      ,而将序列的相关值(12位)存储在哈希表中,然后在此表中查找将是
      O(n)
      。然而,它可能无法扩展到序列的更高值(由于内存),然后对输入值进行排序将是一个保持
      O(n)
      内存复杂性的好主意(应小于存储序列的必要值所需的大小)虽然计算比较好,time@Dici看起来LostMind是在正确的轨道上,这就是为什么我删除了我的评论。内存不应该是一个问题。该系列只适用于92个元素,然后值就不能放入一个
      长的
      @LostMind它是关于对输入值进行排序,这样我们只需要计算fibonacci值只有一次,但因为它们太少了,所以没有用,存储它们更好,所以我同意你的看法(从我知道只有五种可能性的那一刻起)