我正在编写一个程序来检查给定的数字系列是在AP,GP还是HP中。我知道AP是基于共同的差异而GP是基于共同比率。我的代码适用于AP和GP,但HP无法使用。在以下代码中应该进行哪些更正,还有一种方法可以优化我的代码。以下是该计划:
import java.util.*;
class APGPHP
{
public static void main(String[] args)
{
int n;
System.out.println("Enter the number of elements in the series");
Scanner s = new Scanner(System.in);
n = s.nextInt();
int[] a = new int[n];
System.out.println("Enter the numbers");
for (int i = 0;i<n ; i++)
{
System.out.println("Enter the number ["+(i+1)+"] :");
a[i] = s.nextInt();
}
CheckAPGPHP(a);
}
public static void CheckAPGPHP(int[] a)
{
if(a.length<3)
{
System.out.println("Array should contain atleast 3 elements ");
return;
}
if(CheckAP(a) == 1)
{
System.out.println("AP");
if (CheckHP(a) == 1)
System.out.println("HP");
}
if(CheckGP(a) == 1)
System.out.println("GP");
}
public static int CheckAP(int[] a)
{
int iDiff=a[1]-a[0];
for(int i=0;i<a.length-1;i++)
{
if((a[i+1]-a[i])!=iDiff)
return -1;
}
return 1;
}
public static int CheckGP(int[] a)
{
int iRatio=a[1]/a[0];
for(int i=0;i<a.length-1;i++)
{
if((a[i+1]/a[i])!=iRatio)
return -1;
}
return 1;
}
public static int CheckHP(int[] a)
{
float[] b = new float[a.length];
for (int i =0;i<=b.length-1 ;i++ )
{
b[i] = 1.0f/a[i];
}
float iDiff=b[1]-b[0];
for(int i=0;i<b.length-1;i++)
{
if((b[i+1]-b[i])!=iDiff)
return -1;
}
return 1;
}
}
答案 0 :(得分:1)
首先,检查数字是否在彼此的小容差范围内,例如1e-6左右,而不是检查相等性。原因是浮动划分不准确。
例如,在python(5.0 - 4.9)中返回0.09999999999999964,而不是.1。我知道这不是除法,但它是一个简单的例子,表明浮点运算并不精确。
答案 1 :(得分:1)
我发现您的代码存在三个主要问题。可能还有其他一些小问题。
您已将CheckHP
拨打到CheckAP
内,只有在a, b, c
返回1时才会运行。因此,如果他们结果,您只会检查这些数字是否处于和声级算术进展。因此,它永远不会返回true(因为如果它们全部相等,则数字只能在算术级数和谐波级数中)。
您将遇到浮点精度问题。最安全的方法是仅使用整数检查谐波级数,然后乘法而不是除法。当且仅当a * b, a * c, b * c
是算术级数时,才使用CheckGP
是一个和声进展的事实。然后仅使用整数运算来检查它。
当您的数字不是几何级数时,a, b, c
方法中的整数除法会给您带来正面结果。整数分割向下,你不想这样做。检查a * c
是否为几何级数的最佳方法是将b * b
与1
进行比较。
顺便提一下,您的各种检查功能会返回-1
或boolean
表示真或假。为什么不让他们的返回类型true
,并返回false
或long
?
此外,您需要考虑整数溢出。想想你要处理的数字有多大。使用BigInteger
甚至int
代替{{1}}会更安全吗?