Java 为下面的程序编写有效的代码?
我想检查12位数字是否属于斐波那契数列。我写了下面的代码,但它似乎不够有效,我遇到了超时错误。如何优化我的代码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
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 sortn log(n)
,而将序列的相关值(12位)存储在哈希表中,然后在此表中查找将是O(n)
。然而,它可能无法扩展到序列的更高值(由于内存),然后对输入值进行排序将是一个保持O(n)
内存复杂性的好主意(应小于存储序列的必要值所需的大小)虽然计算比较好,time@Dici看起来LostMind是在正确的轨道上,这就是为什么我删除了我的评论。内存不应该是一个问题。该系列只适用于92个元素,然后值就不能放入一个长的@LostMind它是关于对输入值进行排序,这样我们只需要计算fibonacci值只有一次,但因为它们太少了,所以没有用,存储它们更好,所以我同意你的看法(从我知道只有五种可能性的那一刻起)