목적
  - 최대 공약수와 최소 공배수를 C++ 에서 구현한다.

문제
사용자 삽입 이미지

  - 실행 결과는 위의 그림이 나오지 않습니다. 최소 공배수가 다릅니다.

사용자 삽입 이미지


코드

#include <iostream>

using namespace std;

int main(void)
{
 int iA, iB, iC, iGCM, iLCM, iMin, iMax, i;
 iA = iB = iC = iMin = iLCM = iMax = 0;
 i = iGCM = 1;

 cout << "세개의 정수 입력: ";
 cin >> iA >> iB >> iC;

 iMax = iA;
 iMax = iB > iMax ? iB : iMax;
 iMax = iC > iMax ? iC : iMax;

 iMin = iA;
 iMin = iB < iMin ? iB : iMin;
 iMin = iC < iMin ? iC : iMin;

 while(i <= iMin)
 {
  if(iA % i == 0 && iB % i == 0  && iC % i == 0)
   iGCM = iGCM < i ? i : iGCM;
  i++;

 }

 i = iMax;
 while(i <= iA * iB * iC)
 {
  if( i % iA == 0 && i % iB == 0 && i % iC == 0)
  {
   iLCM = i;
   break;
  }

  i++;
 }


 cout << "최대 공약수 : ";
 cout << iGCM << endl;
 cout << "최소 공배수 : ";
 cout << iLCM << endl;

 return 0;
}

해설
  - 최소 공배수는 최대값을 시작으로 세수로 나눈 나머지가 0인 첫번째 수를 최대 공약수는 1부터 최소값까지 나머지가 0인 최대값을 구하면 됩니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 최대공약수와 공약수의 원리를 이해하고 C 에 적용시킨다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int iA, iB, iC, iMin, iMax, i, iGCM;
 iA = iB = iC = iMin = iMax = iGCM = 0;
 i = 1;

 cout << "세 정수값을 입력하세요 : ";
 cin >> iA >> iB >> iC;

 iMin = iMax = iA;
 iMin = iMin > iB ? iB : iMin;
 iMin = iMin > iC ? iC : iMin;

 iMax = iMax < iB ? iB : iMax;
 iMax = iMax < iC ? iC : iMax;

 cout << "약수 : ";
 while(i <= iMin)
 {
  if(iMin % i == 0)
   cout << i << " ";

  i++;
 }

 i = 1;
 cout << endl << "최대공약수 : ";

 while(i <= iMax)
 {
  if(iA % i == 0 && iB % i == 0 && iC % i == 0)
   iGCM = iGCM < i ? i : iGCM;

  i++;
 }

 cout << iGCM << endl;

 return 0;
}

해설
  - 최대 공약수는 최대값까지 공통적으로 나머지가 0인 수의 최대값을 구하면 됩니다.
  - 공약수는 전부 나눠서 나머지가 0인 값을 출력하면 됩니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 최소공배수와 최대공약수를 구하기 위한 조건과 반복문 나눗셈 사용을 익힌다.

문제
사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

int main(void)
{
 int iA, iB, iLCM, iGCD, iStart, iEnd ; // iLCM : 최소공배수 iGCD : 최대공약수
 iA = iB = iLCM = iGCD = iStart = iEnd = 0;

 cout << "두 정수값을 입력하세요 : ";
 cin >> iA >> iB;

 iStart = iA <= iB ? iA : iB;
 iEnd = iA <= iB ? iB : iA;
 iA = iStart;
 iB = iEnd;

 // LCM, GCD 계산
 for(iStart = 1; iStart <= iEnd; iStart++)
  if(iA % iStart == 0 && iB % iStart == 0)
   iGCD = iGCD < iStart ? iStart : iGCD;

 for(iStart = iB; iStart <= iA * iB; iStart++)
  if(iStart % iA == 0 && iStart % iB == 0)
  {
   iLCM = iStart;
   break;
  }
 
 cout << iA << " 과 " << iB << " 의 최대공약수 : " << iGCD << endl;
 cout << iA << " 과 " << iB << " 의 최소공배수 : " << iLCM << endl;

 return 0;
}

해설
  - 최대공약수 : 1에서 큰수까지 1씩 증가하며 가는데 작은수 와 큰수 모두 나머지가 0인 수
  - 최소공배수 : 큰수에서 두수의 곱까지 1씩 증가하는데 그수와 두수 모두의 나머지가 0인 수

참고
  - 유사 문제

Posted by 카켈




1. 목적

  - 최소공배수 / 최대공약수 를 C 로 구현한다.

2. 문제 (점수 : 15 점)
  - 크기와 관계 없는 두개의 정수를 입력 받아 최대공약수와 최소공배수를 찾는다.
  - 실행결과

정수값 두개를 입력하세요 : 120 750
최대 공약수 : 30
최소 공배수 : 3000
Press any key to continue

3. 이해
  - 최소공배수와 최대공약수를 이해하는가?
  - 조건에 맞는 반복문을 구현할수 있는가?

4. 코드

#include <stdio.h>

int main()
{
 int a, b, start, end;
 a = b = start = end = 0;
 printf("정수값 두개를 입력하세요 : ");
 scanf("%d %d", &a, &b);

 start = a > b ? b : a;
 end = a < b ? b : a;

 a = b = 1;

 for(a = 1; a <= start; a++)
 {
  if(start % a == 0 && end % a == 0)
   b = a > b ? a : b;
 }

 printf("최대 공약수 : %d\n", b);

 a = start;
 b = 0;

 while(a <= start * end)
 {
  if(a % start == 0 && a % end == 0)
  {
   b = a;
   break;

  }

  a++;

 }

 printf("최소 공배수 : %d\n", b);

 return 0;
}

5. 해설
  - 최대공약수는 1 부터 큰수 까지 두수 모두 나머지가 0이 되는 가장큰수를 의미합니다.
  - 최소공배수는 작은수에서 시작하여 두수 모두 나머지가 0이 되는 가장 작은 수를 의미합니다.
  - 두가지 모두 for 문 / while 문으로 구현했습니다.

6. 참고
  - 유사 문제 (다른 것)

Posted by 카켈




1. 목적
  - 배열을 이해한다.
  - 최대 공약수를 적용할줄 안다.

2. 문제 (점수 : 20 점)
  - 0 보다 큰 정수 4 개를 입력받아서 최대 공약수를 찾아내는 프로그램을 작성하라
  - 입력된 정수는 배열에 저장해야 한다.
  - 그 이외 특정한 조건 없음
  - 출력 형식

정수값을 입력하세요 : 100
정수값을 입력하세요 : 125
정수값을 입력하세요 : 300
정수값을 입력하세요 : 400
최대공약수 : 25
Press any key to continue

3. 이해
  - 배열에 자료를 저장할수 있는가?
  - 최대공약수를 이해하고 공약수에서 발전하여 적용하였는가?

4. 코드

#include <stdio.h>

int main()
{
 int in[4] = {0};
 int i, max, gcm;
 i = max = gcm = 0;
 
 while(i<4)
 {
  printf("정수값을 입력하세요 : ");
  scanf("%d",&in[i]);
  max = max < in[i] ? in[i] : max;
  i++;
 }

 i = 1;

 while(i<=max)
 {
  if(in[0] % i == 0 && in[1] % i == 0 && in[2] % i == 0 && in[3] % i == 0)
   gcm = gcm < i ? i : gcm;

  i++;

 }

 printf("최대공약수 : %d\n", gcm);

 return 0;

}

5. 해설
  - 최대공약수는 공약수들 중에서 가장 큰수를 의미 합니다.
  - 공약수 계산할때 첫 숫자는 1에서 시작합니다. (0에서 시작하면 나눗셈 오류)
  - 삼항 연산자를 최대한 활용하였습니다.

6. 참고
  - 공약수 문제

Posted by 카켈
이전페이지 1 다음페이지