본문 바로가기

프로그래밍/자바소스 및 자료

[자바소스] 약수, 공약수, 최대공약수 구하는 프로그램


1. 소스 설명
 약수, 공약수, 최대공약수 를 구하는 프로그램입니다. 메인에 메뉴를 구성했구요.
while문, for문, switch, if문 등을 다양하게 이용하였으며, 각 수를 구하는 공식들은 메소드를 따로 구성했습니다.
 그리고 마지막에 print 메소드를 넣어서 약수와 공약수는 배열로 반환이 되는데, 이를 간단히 출력할 수 있도록 구성했습니다.

 소스를 보시게 되면 배열의 사이즈를 구성하는 구문이 있는데 이것 또한 다른 메소드로 구현 가능하겠고,
ArrayList와 Iterator(반복자) 등등을 이용해서 다음 소스를 작성할 수도 있겠습니다.

참고로 결과문에 \b\b가 나올자리에 이상한 문자료 표시되는 것은 이클립스 오류로, 커맨드창으로 들어가셔서 한다면
제대로된 결과를 보실 수 있을겁니다.


2. 소스 : Test.java
import java.util.Scanner;
public class Test{
 public static void main(String[] args){
  
  Scanner input=new Scanner(System.in);
  while(true){
   System.out.println("====================================");
   System.out.println("약수, 공약수, 최대공약수 구하기 프로그램");
   System.out.println("====================================");
   System.out.println("1. 약수 구하기");
   System.out.println("2. 공약수 구하기");
   System.out.println("3. 최대 공약수 구하기");
   System.out.println("4. 프로그램 종료");
   System.out.print("실행하려는 번호를 입력하세요. >  ");
   int choice=input.nextInt();
 
   while(choice!=1 && choice!=2 && choice!=3 && choice!=4){  
    System.out.print("잘 못 입력하셨습니다. 다시 입력하세요. >  ");
    choice=input.nextInt();
   } // 메뉴 검사구문
   
   if(choice==4){
    while(true){
     System.out.print("정말 종료하시겠습니까(Y/N)? ");
     String exit=input.next();
     if("Y".equals(exit.toUpperCase())){
      System.out.println("프로그램이 종료됩니다.");
      System.exit(0);
     }
     else if("N".equals(exit.toUpperCase())){
      break;
     }
     else
      System.out.println("잘 못 입력하셨습니다.");
     continue;
    }
   }
   
   System.out.println("\n");
   
   while(true){
    switch(choice){
     case 1 :
       System.out.println("<<약수 구하기>>");
       System.out.print("확인하려는 수를 입력하세요 : ");
       int number=input.nextInt();
       System.out.printf("확인된 약수는 %s 입니다.\n", print(divisor(number)) );
       break;
     case 2 :
      System.out.println("<<공약수 구하기>>");
      System.out.print("확인하려는 두 수 중 첫번째를 입력하세요 : ");
      int number1=input.nextInt();
      System.out.print("확인하려는 두 수 중 두번째를 입력하세요 : ");
      int number2=input.nextInt();
      System.out.printf("확인된 공약수는 %s 입니다.\n", print(commonDivisor(number1, number2)) );
      break;
     case 3 :
      System.out.println("<<최대 공약수 구하기>>");
      System.out.print("확인하려는 두 수 중 첫번째를 입력하세요 : ");
      int number3=input.nextInt();
      System.out.print("확인하려는 두 수 중 두번째를 입력하세요 : ");
      int number4=input.nextInt();
      System.out.printf("확인된 최대공약수는 %d 입니다.\n", greatCommonDivisor(number3, number4) );
      break;
    } //스위치문 종료
    
    System.out.print("하던 작업을 계속 하시겠습니까(Y/N)? ");
    String con=input.next();
 
    while(!("Y".equals(con.toUpperCase()) || "N".equals(con.toUpperCase()))){  
     System.out.print("잘 못 입력하셨습니다.");
     System.out.print("하던 작업을 계속 하시겠습니까(Y/N)? ");
     con=input.next();           //여기가 문제
    } // 답변 검사구문
   
    if("N".equals(con.toUpperCase())){
     System.out.println("메인메뉴로 돌아갑니다.");
     break; //while문 빠져나가고 메인 while문 다시시작
    }
    else
     continue;
   }//while문 종료
   
  } //메인 while문 종료
 }//메인 메소드 종료
 
 public static int[] divisor(int a){
  int size=0;
  for(int i=1;i<=a;i++){
   if(a%i==0)
    size++;
  } // 따로 메소드 만드는 것도 가능. 그게 좋아보임.
  
  int[] div=new int[size];
  int count=0;
  
  for(int i=1;i<=a;i++){
   if(a%i==0){
    div[count]=i;
    count++;
   }
  }
  return div;
 }
 
 public static int[] commonDivisor(int a, int b){
  int[] div1=divisor(a);
  int[] div2=divisor(b);
  int size=0;
  
  for(int i=0;i<div1.length;i++){
   for(int j=0;j<div2.length;j++){
    if(div1[i]==div2[j])
     size++;
   }
  }
  
  int[] comDiv=new int[size];
  int count=0;
  
  for(int i=0;i<div1.length;i++){
   for(int j=0;j<div2.length;j++){
    if(div1[i]==div2[j]){
     comDiv[count]=div1[i];
     count++;
     break; //두번째 div2를 순회하는 for문 종료. 공약수를 찾았으므로 더 찾을 필요없음.
    }
   } 
  }
  
  return comDiv; 
 }
 
 public static int greatCommonDivisor(int a, int b){
  int[] tDiv=commonDivisor(a, b);
  return tDiv[tDiv.length-1];
 }
 
 public static String print(int[] Array){
  String result="";
  for(int i=0;i<Array.length;i++){
   result+=Array[i]+", ";
  }
  return result+"\b\b";
 }
}



3. 결과




4. 관련 링크 
fo문에 대해서 알아보기


소스에 대한 설명이 더 필요하시거나, 기타 다른 소스가 필요시에는
댓글이나 방명록으로 남겨놓으시면, 하루이틀내에 소스 작성해서 올리겠습니다.
도움 되셨다면 밑의 추천(손가락 표시)과 댓글 부탁드립니다.