检查给定的数字序列是否处于算术级数或几何级数或谐波级数

时间:2014-03-02 19:36:47

标签: java

我正在编写一个程序来检查给定的数字系列是在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;
}
}

2 个答案:

答案 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 * b1进行比较。

顺便提一下,您的各种检查功能会返回-1boolean表示真或假。为什么不让他们的返回类型true,并返回falselong

此外,您需要考虑整数溢出。想想你要处理的数字有多大。使用BigInteger甚至int代替{{1}}会更安全吗?