본문 바로가기
JAVA

[JAVA] - 자바 등차수열, 등비수열 예제

by nam_ji 2024. 10. 2.

자바 등차수열, 등비수열 구하기 및 구분하기 예제

등차수열

1. 등차수열이란

  • 등차수열은 연속된 두 항의 차이가 일정한 수열을 말합니다.
  • 이 일정한 차이를 공차라고 부릅니다.

2. 등차수열 예제

package math;

public class ArithmeticSequence_GeometricSequence {
  public static void main(String[] args) {
    int firstTerm = 2;  // 첫 번째 항
    int numberOfTerms = 10;  // 출력할 항의 개수

    int commonDifference = 2;  // 공차

    ArithmeticSequence arithmeticSequence = new ArithmeticSequence();
    arithmeticSequence.ArithmeticSequence(firstTerm, commonDifference, numberOfTerms);
  }
}

class ArithmeticSequence {
  public void ArithmeticSequence (int firstTerm, int commonDifference, int numberOfTerms) {
    /*
    등차수열 구하는 방법
    등차수열이란 연속되는 수의 차이가 일정한 수열을 말합니다.
    */
    System.out.println("\n-------------------등차수열 2씩 증가하는 예시-------------------");

    for (int i = 0; i < numberOfTerms; i++) {
      int term = firstTerm + i * commonDifference;
      System.out.print(term + " ");
    }

  }
}

/*
-------------------등차수열 2씩 증가하는 예시-------------------
2 4 6 8 10 12 14 16 18 20 
*/

 


등비수열

1. 등비수열이란

  • 등비수열은 연속된 두 항의 비율이 일저한 수열을 말합니다.
  • 이 일정한 비율을 공비라고 부릅니다.

2. 등비수열 예제

package math;

public class ArithmeticSequence_GeometricSequence {
  public static void main(String[] args) {
    int firstTerm = 2;  // 첫 번째 항
    int numberOfTerms = 10;  // 출력할 항의 개수

    int commonRatio = 2;  // 공비
    
    GeometricSequence geometricSequence = new GeometricSequence();
    geometricSequence.GeometricSequence(firstTerm, commonRatio, numberOfTerms);
  }
}

class GeometricSequence {
  public void GeometricSequence (int firstTerm, int commonRatio, int numberOfTerms) {
    /*
    등비수열 구하는 방법
    등비수열이란 연속되는 수의 비율이 일정한 수열을 말합니다.
     */
    System.out.println("\n\n-------------------등비수열 2의 배수로 증가하는 예시-------------------");

    for (int i = 0; i < numberOfTerms; i++) {
      int term = (int)(firstTerm * Math.pow(commonRatio, i));
      System.out.print(term + " ");
    }
  }
}

/*
출력
-------------------등비수열 2의 배수로 증가하는 예시-------------------
2 4 8 16 32 64 128 256 512 1024 
*/

등차수열, 등비수열 구분하기

package math;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class ArithmeticSequence_GeometricSequence {
  public static void main(String[] args) {
    DistinguishArithmeticGeometricProgressions dAGP = new DistinguishArithmeticGeometricProgressions();

    Scanner scanner = new Scanner(System.in);
    System.out.print("\n\n수열의 항 개수 : ");
    int first = scanner.nextInt();
    System.out.print("\n수열의 증가량 : ");
    int increase = scanner.nextInt();
    System.out.print("\nArithmetic 또는 Geometric 입력");
    String question = scanner.next();
    int[] sequence = dAGP.generateNonArithmeticGeometricSequence(first, increase, question);

    if (dAGP.isArithmeticSequence(sequence)) {
      System.out.println(Arrays.toString(sequence));
      System.out.println("이 수열은 등차수열입니다.");
    } else if (dAGP.isGeometricSequence(sequence)) {
      System.out.println(Arrays.toString(sequence));
      System.out.println("이 수열은 등비수열입니다.");
    } else {
      System.out.println("이 수열은 등차수열도 등비수열도 아닙니다.");
    }
  }
}

class DistinguishArithmeticGeometricProgressions {

  // 랜덤한 등차수열과 등비수열이 아닌 수열 생성
  public int[] generateNonArithmeticGeometricSequence(int first, int increase, String question) {
    int[] sequence = new int[first];

    if (question.equals("Arithmetic")) {
      for (int i = 0; i < first; i++) {
        sequence[i] = (i * increase) + 1;
      }
    } else if (question.equals("Geometric")){
      for (int i = 0; i < first; i++) {
        sequence[i] = (int) Math.pow(increase, i + 1);
      }
    } else {
      Random random = new Random();
      for (int i = 0; i < first; i++) {
        sequence[i] = random.nextInt(20);
      }
    }
    return sequence;
  }

  // 등차수열인지 확인하는 함수
  public boolean isArithmeticSequence(int[] sequence) {
    if (sequence.length < 2) {
      return false;
    }

    int commonDifference = sequence[1] - sequence[0];
    for (int i = 2; i < sequence.length; i++) {
      if (sequence[i] - sequence[i - 1] != commonDifference) {
        return false;
      }
    }
    return true;
  }

  // 등비수열인지 확인하는 함수
  public boolean isGeometricSequence(int[] sequence) {
    if (sequence.length < 2 || sequence[0] == 0) {
      return false;
    }

    double commonRatio = (double) sequence[1] / sequence[0];
    for (int i = 2; i < sequence.length; i++) {
      if ((double) sequence[i] / sequence[i - 1] != commonRatio) {
        return false;
      }
    }
    return true;
  }
}

전체코드

package math;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class ArithmeticSequence_GeometricSequence {
  public static void main(String[] args) {
    int firstTerm = 2;  // 첫 번째 항
    int numberOfTerms = 10;  // 출력할 항의 개수

    int commonDifference = 2;  // 공차
    int commonRatio = 2;  // 공비



    ArithmeticSequence arithmeticSequence = new ArithmeticSequence();
    arithmeticSequence.ArithmeticSequence(firstTerm, commonDifference, numberOfTerms);

    GeometricSequence geometricSequence = new GeometricSequence();
    geometricSequence.GeometricSequence(firstTerm, commonRatio, numberOfTerms);

    DistinguishArithmeticGeometricProgressions dAGP = new DistinguishArithmeticGeometricProgressions();
    /*
    n = 5 등차수열
    n = 4 등비수열
     */

    Scanner scanner = new Scanner(System.in);
    System.out.print("\n\n수열의 항 개수 : ");
    int first = scanner.nextInt();
    System.out.print("\n수열의 증가량 : ");
    int increase = scanner.nextInt();
    System.out.print("\nArithmetic 또는 Geometric 입력");
    String question = scanner.next();
    int[] sequence = dAGP.generateNonArithmeticGeometricSequence(first, increase, question);

    if (dAGP.isArithmeticSequence(sequence)) {
      System.out.println(Arrays.toString(sequence));
      System.out.println("이 수열은 등차수열입니다.");
    } else if (dAGP.isGeometricSequence(sequence)) {
      System.out.println(Arrays.toString(sequence));
      System.out.println("이 수열은 등비수열입니다.");
    } else {
      System.out.println("이 수열은 등차수열도 등비수열도 아닙니다.");
    }
  }
}

class ArithmeticSequence {
  public void ArithmeticSequence (int firstTerm, int commonDifference, int numberOfTerms) {
    /*
    등차수열 구하는 방법
    등차수열이란 연속되는 수의 차이가 일정한 수열을 말합니다.
    */
    System.out.println("\n-------------------등차수열 2씩 증가하는 예시-------------------");

    for (int i = 0; i < numberOfTerms; i++) {
      int term = firstTerm + i * commonDifference;
      System.out.print(term + " ");
    }

  }
}

class GeometricSequence {
  public void GeometricSequence (int firstTerm, int commonRatio, int numberOfTerms) {
    /*
    등비수열 구하는 방법
    등비수열이란 연속되는 수의 비율이 일정한 수열을 말합니다.
     */
    System.out.println("\n\n-------------------등비수열 2의 배수로 증가하는 예시-------------------");

    for (int i = 0; i < numberOfTerms; i++) {
      int term = (int)(firstTerm * Math.pow(commonRatio, i));
      System.out.print(term + " ");
    }
  }
}

class DistinguishArithmeticGeometricProgressions {

  // 랜덤한 등차수열과 등비수열이 아닌 수열 생성
  public int[] generateNonArithmeticGeometricSequence(int first, int increase, String question) {
    int[] sequence = new int[first];

    if (question.equals("Arithmetic")) {
      for (int i = 0; i < first; i++) {
        sequence[i] = (i * increase) + 1;
      }
    } else if (question.equals("Geometric")){
      for (int i = 0; i < first; i++) {
        sequence[i] = (int) Math.pow(increase, i + 1);
      }
    } else {
      Random random = new Random();
      for (int i = 0; i < first; i++) {
        sequence[i] = random.nextInt(20);
      }
    }
    return sequence;
  }

  // 등차수열인지 확인하는 함수
  public boolean isArithmeticSequence(int[] sequence) {
    if (sequence.length < 2) {
      return false;
    }

    int commonDifference = sequence[1] - sequence[0];
    for (int i = 2; i < sequence.length; i++) {
      if (sequence[i] - sequence[i - 1] != commonDifference) {
        return false;
      }
    }
    return true;
  }

  // 등비수열인지 확인하는 함수
  public boolean isGeometricSequence(int[] sequence) {
    if (sequence.length < 2 || sequence[0] == 0) {
      return false;
    }

    double commonRatio = (double) sequence[1] / sequence[0];
    for (int i = 2; i < sequence.length; i++) {
      if ((double) sequence[i] / sequence[i - 1] != commonRatio) {
        return false;
      }
    }
    return true;
  }

}

/*
출력
-------------------등차수열 2씩 증가하는 예시-------------------
2 4 6 8 10 12 14 16 18 20 

-------------------등비수열 2의 배수로 증가하는 예시-------------------
2 4 8 16 32 64 128 256 512 1024 
*/