Java 检查给定的数列是否为算术级数、几何级数或调和级数
我正在写一个程序来检查给定的数字系列是AP、GP还是HP。我知道AP是基于公共差分的,GP是基于公共比率的。我的代码适用于AP和GP,但不适用于HP。在下面的代码中应该做什么修改,还有一种方法可以优化我的代码。节目如下:Java 检查给定的数列是否为算术级数、几何级数或调和级数,java,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 elemen
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;
}
}
import java.util.*;
类APGPHP
{
公共静态void main(字符串[]args)
{
int n;
System.out.println(“输入系列中的元素数”);
扫描仪s=新的扫描仪(System.in);
n=s.nextInt();
int[]a=新的int[n];
System.out.println(“输入数字”);
对于(int i=0;i首先,不要检查相等性,而是检查数字是否在彼此的一些小公差范围内,例如1e-6左右。原因是浮点除法不精确
例如,在python(5.0-4.9)中,返回0.09999999964,而不是.1。我知道这不是除法,但这是一个简单的例子,表明浮点运算不精确。我发现代码中有三个主要问题。可能还有其他次要问题
- 您已将对
CheckHP
的调用放在分支内,该分支仅在CheckAP
返回1时运行。因此,您将只在数字以算术级数进行时检查它们是否以调和级数进行。因此,它永远不会返回true(因为这些数字只有在算术级数和调和级数都相等的情况下才能同时存在)
- 您将遇到浮点精度问题。最安全的方法是仅使用整数检查调和级数,并使用乘法而不是除法。请使用以下事实:
a,b,c
是调和级数,当且仅当a*b,a*c,b*c
是算术级数。然后仅使用整数检查此项r算法
- 当您的数字不是几何级数时,
CheckGP
方法中的整数除法将给您带来正结果。整数除法向下取整,您不想这样做。检查a,b,c
是否是几何级数的最佳方法是将a*c
与b*b
顺便说一句,您的各种检查函数返回1
或-1
表示true或false。为什么不将其返回类型设置为布尔值,并返回true
或false
另外,你需要考虑整数溢出。想想你要处理的数字有多大。使用long
或者甚至biginger
来代替int
?你的意思是我应该指定像b[i]=(float,2)1.0f/a[i]这样的浮点时的精度位数吗;
?我的意思是,不要检查x!=ratio,而是检查abs(x-ratio)是否正确。正如你所说,我从AP块中删除了对HP的调用。还将所有函数的返回类型更改为boolean。现在代码工作正常。下面是代码:公共静态布尔检查HP(int[]a){int[]b=new int[]{a[0]*a[1],a[0]*a[2],a[1]*a[2]};if(CheckAP(b))返回true;return false;}
这里我对数组b中的值进行了硬编码,因此它只检查前3项。我是否应该将其放入for循环中,并使用a中的所有元素创建b数组?最后,我的AP和GP逻辑正确吗?谢谢。)你的AP逻辑是正确的。你的GP逻辑是错误的。我将编辑我的答案。