以算术或几何级数获得下一个序列

时间:2015-05-12 10:42:42

标签: java algorithm

我想创建一个应用程序,每行生成3个数字序列,当它到达一系列零时生成并停止,然后打印,如果它是算术级数或几何级数,则打印系列中的下一个数字。

示例输入:

4 7 10    
2 6 18    
0 0 0

应输出

AP 13    
GP 54

这是我的代码我想知道它有什么问题以及我的代码无法使用的可能性。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
{
    static String s="";
    public static void main (String[] args) throws IOException
    {
    String c;

        String a[];
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        do {
            c= br.readLine();
            a = c.split(" ");
            if(c.charAt(0)!='0'){
            calc(a[1], a[2]);
            }
        }while((c.charAt(0))!='0');
        printer(s);
    }
    public static void calc(String a, String b){
            int x = Integer.parseInt(a);
            int y = Integer.parseInt(b);
            if(y%x==0){
                s += "GP" +" " + (y*(y/x)) + "z";
                return;

            }else{
                s += "AP" + " " + (y + (y-x)) + "z";
                return;
            }
}
    public static void printer(String s){
        String p= "";
        for(int i =0;i<=s.length()-1;i++){
            if(s.charAt(i)!='z'){
                p+= s.charAt(i);
            }else{
                System.out.println(p);
                p= "";
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您发现进展类型不正确的问题。例如,0 4 8显然是AP,但您的算法会说它是GP。另一个示例:8 4 2是GP,但2%4将返回false,说它是AP。此外,当提供的序列根本不是进展时,您不会处理案例。

绝对清楚的是,所有3个数字都应该参与其中。假设整数a, b, c形成AP或GP,您需要发现它的进展。可以使用简单的数学运算:

  1. 如果他们形成AP,那么a + c = b + b。下一个元素是c + c - b
  2. 如果他们组成GP,那么a * c = b * b。下一个元素是c * c / b
  3. (当您从AP切换到GP时,请注意+如何更改为*,以及-更改为/

答案 1 :(得分:1)

您的代码假设如果3个数字序列中的两个连续数字可被整除,则该系列是GP,如果不是,则它必须是AP。这个假设是错误的。在许多情况下它不会是真的,例如0,3,6系列。它是一个AP,而不是GP。因此,不应将2个参数发送到函数calc(),而应将所有三个数字作为参数发送,并检查如下:

    if((a+c)==(2*b))
    {//AP
    }
    else if((a*c)==(b*b))
    {//GP
    }

以上是对算术和几何进度的正确检查。同时在检查输入是否全为0时,您只检查第一个元素。相反,你必须看看是否所有三个元素都是0.你的代码可能不适用于0,3,6或0,2,4或0,1,2的情况。所以你必须像这样检查:

    int flag=0;
    for(int i=0;i<3;i++)
        if(Integer.parseInt(a[i]))
             flag=1;
    if(flag==1)
    {//continue prog
    }
    else
    {//Terminate prog as input is 0,0,0
    }