问题定义
给出一个数字来判断它的Fibonacci数字是否合适。
输入
示例输入
3
5
7
8
示例输出
IsFibo
IsNotFibo
IsFibo
此问题的代码如下所示
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) throws IOException {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
for(int i=0;i<tc;i++)
{
int n = Integer.parseInt(br.readLine());
doThis(n);
}
}
public static void doThis(int n)
{
double one = Math.sqrt((5*n*n)+4);
double two = Math.sqrt((5*n*n)-4);
if(one % 1 == 0 || two % 1 == 0)
{
System.out.println("IsFibo");
}
else
{
System.out.println("IsNotFibo");
}
}
}
我在此链接中提供了使用Math.sqrt((5*n*n)-4)
或Math.sqrt((5*n*n)+4)
的原因
www.fq.math.ca/Scanned/10-4/advanced10-4.pdf pagenumber 418.
这怎么不适用于所有情况,大多数情况都失败了,我不明白为什么?
答案 0 :(得分:0)
尝试@rossum解决方案:
int one = (int) Math.sqrt((5*n*n)+4);
int two = (int) Math.sqrt((5*n*n)-4);
永远不要测试双重值是否相等,每次都会失败(几乎)。如果您声明:
double one = 1.0;
double two = 1.0;
one
可能是1.0000000001,two
可能是1.00000000000000001。您可以看到值不是(完全)相同。
在这种情况下,你应该这样比较:
if(Math.abs(one-two)<0.001){
//do something
}
在你的情况下,我认为你应该像@rossum建议的那样将double转换为int。
答案 1 :(得分:0)
d % 1 == 0
对于任何双d
来说都不是一个完全可靠的测试,因为例如Math.sqrt
的一些细微不准确可能会给你d = 2.000000004
或者某些东西而不是2
。相反,您应该与容差进行比较,例如d % 1 < 0.001
如果d
始终为正。
答案 2 :(得分:0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BasicEmployeeService {
public static void main(String[] args) throws IOException {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
System.out.println("Enter the number");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
for (int i = 0; i < tc; i++) {
int n = Integer.parseInt(br.readLine());
doThis(n);
}
}
public static void doThis(int n) {
long square = n * n;
double one = Math.sqrt((5 * square) + 4);
double two = Math.sqrt((5 * square) - 4);
if (one % 1 == 0 || two % 1 == 0) {
System.out.println("IsFibo");
} else {
System.out.println("IsNotFibo");
}
}
}
答案 3 :(得分:0)
实际答案是将int类型更改为double,同时将值读取为
Double tc = Double.parseDouble(br.readLine());
并将double传递给函数doThis
public static void doThis(Double n) {
现在它完美无缺