[C++] 완전수 찾기소스

비주얼C++/예제모음 2014. 7. 24. 21:36


[C++] 완전수 찾기소스


완전수란?

"완전수란 자신을 제외한 모든 양의 약수들의 합을 가진 양수이다. 예를들어 6은 완전수이다. 왜냐하면 

약수 1,2,3의 합이 6이기 때문이다. 또한 28도 완전수이다. 

또다른 완전수 : 496,8128


What is a perfect number?

"Perfect number is a positive number which sum of all positive divisors excluding that number." 

For example 6 is Perfect Number since divisor of 6 are 1, 2 and 3. Sum of its divisor is

1 + 2+ 3 =6

and  28 is also a Perfect Number

 since 1+ 2 + 4 + 7 + 14= 28

Other perfect numbers: 496, 8128


코드 :


#include<iostream.h>


void main()                 //Start of main

{

    char ch;

int i=1, u=1, sum=0;

   while(i<=500)

 {                                  // start of first loop.


   while(u<=500)

   {                               //start of second loop.

     if(u<i)

     {

      if(i%u==0 ) // 

      sum=sum+u;

     }                          //End of if statement

    

     u++;

   }                           //End of second loop


   if(sum==i)

   {

     cout << i << " 는 완전수입니다." << "\n";

   }


   i++;

   u=1;  sum=0;

 }                             //End of First loop

 cin.get(ch);

 }                            //End of main



'비주얼C++ > 예제모음' 카테고리의 다른 글

삽입정렬  (0) 2012.11.24
선택정렬  (0) 2012.11.24
버블정렬  (0) 2012.11.24


설정

트랙백

댓글

삽입정렬

비주얼C++/예제모음 2012. 11. 24. 21:19


삽입정렬

 

  예를들어

 

  7 3 5 2 1 8 9 4 6 0

 

  이렇게 있을때

  먼저 두번째 값 3을 정해서 3앞의 숫자들과 비교해서 위치를 옮깁니다.

  여기서는 7과 비교해서 3이 작으므로 바꿉니다. 그러면,

 

  3 7 5 2 1 ...

 

  이렇게 되겠지요?

 

  그다음에 앞의 두번째를 한칸 더 증가시킵니다. 즉 세번째 수 5를 정해서 그 앞의 수 즉, 두번째 첫번째 수와 비교해서 적당한 자리로 옮깁니다. 여기서 적당한

자리란 5와 7을 먼저 비교해서 7이 더 크므로 바꾸고 (3 5 7 ..) 다시 3과 비교해서 3보다 크므로 그대로 둡니다. 이 작업을 계속 해 주면 됩니다. (네번째, 다섯번째

수를 정해서 앞의 숫자와 거꾸로 계속 비교해 가는 것입니다.

 

  설명하기가 참 어렵네요...제가 그래픽 솜씨라도 있으면 그래픽으로 설명해 드릴수도 있을텐데...

 

  소스입니다.

 

      for (int i=1;i<9;i++) // i는 처음부터 끝까지 갑니다.
 for (int j=i-1;j>0;j--)  // j는 i보다 하나 적은 곳부터 처음까지 검색합니다.
  if (num[j]>num[i]) {  // 두수를 비교해서 바꿔줍니다.
   int temp;
            temp = num[j];
   num[i] = num[j];
   num[j] = temp;
  }
 cout << "삽입정렬후 : " << num[0] << " " << num[1] << " " << num[2] << " " << num[3] << " " << num[4] << " " << num[5] << " " << num[6] << " " << num[7] << " " << num[8] << " " << num[9] << "\n";

 

  이해안되시는 부분은 댓글이나 쪽지주세요~

'비주얼C++ > 예제모음' 카테고리의 다른 글

[C++] 완전수 찾기소스  (0) 2014.07.24
선택정렬  (0) 2012.11.24
버블정렬  (0) 2012.11.24


설정

트랙백

댓글

선택정렬

비주얼C++/예제모음 2012. 11. 24. 20:48


선택정렬

 

  선택정렬은 두개의 포인터를 두고 한개는 현재위치를 한개는 나머지를 검색하면서 가장 작은 숫자를 찾는 것입니다. 예를 들어

 

  7 3 5 2 1 8 9 4 6 0

 

  이렇게 있을때

  처음 포인터를 7에 두고 뒤의 포인터를 3부터 0까지 검색하는 거지요.

  검색해서 가장 작은 숫자(여기서는 0)를 찾아서 7과 바꿔주는 겁니다. 그러면

 

   0 3 5 2 1 8 9 4 6 7

 

  이렇게 되겠지요?

  버블정렬에서는 가장 큰수가 맨뒤로 가는 것이 처음단계였다면 선택정렬에서는 가장 작은수가 앞으로 오는 것이 가장 첫단계가 되겠습니다.

 

  그다음에 현재 포인터를 두번째로 옮기고 (여기서는 3) 세번째부터 끝까지 검색하는 거지요. 그러면 5부터 7까지 검색이 되겠지요? 그 중에 1이 가장

작으니깐 1과 3을 바꿔줍니다.

 

  0 1 5 2 3 8 9 4 6 7

 

  이렇게 바뀌겠지요?

 

  이런 작업을 마지막까지 해주면 됩니다. 이해되시죠?

  그럼 소스를 볼까요?

 

{
 int min; // 최소수의 자릿수
 for (int j=0;j<9;j++) {
  min = j; // j 즉 위치포인터를 항상 가장 작다고 정해줍니다.
  for (int i=j+1;i<9;i++)
   if (num[min]>num[i]) min=i; // 위치포인터값과 검색포인터값을 비교해서 위치포인터값이 크면
   
        // 바꿔줍니다.
  int temp;
  temp = num[min];
  num[j] = num[min];
  num[min] = temp;
 };
 cout << "선택정렬후 : " << num[0] << " " << num[1] << " " << num[2] << " " << num[3] << " " << num[4] << " " << num[5] << " " << num[6] << " " << num[7] << " " << num[8] << " " << num[9] << "\n";
}

  이해가시리라 믿습니다. 이해안되시면 댓글이나 쪽지주세요~

'비주얼C++ > 예제모음' 카테고리의 다른 글

[C++] 완전수 찾기소스  (0) 2014.07.24
삽입정렬  (0) 2012.11.24
버블정렬  (0) 2012.11.24


설정

트랙백

댓글

버블정렬

비주얼C++/예제모음 2012. 11. 24. 17:51


버블정렬

 

  예를들어 7 3 5 2 1 8 9 4 6 0 이라는 숫자가 있다고 합시다. 이것을 버블정렬로 순서대로 정렬하는 법을 말씀드리겠습니다.
  먼저 첫번째수 7과 다음수 3을 비교합니다. 두 수중에 작은수(오름차순정렬일때)가 3이니깐 앞에 작은수가 와야하므로 두수를 바꿉니다. 그럼,
 
  3 7 5 2 1 ...

  이렇게 되겠지요.

 

  그다음에 첫번째수를 비교했으므로 한칸 뒤로 가서 두번째수를 비교합니다. 7과 5지요. 5가 작으므로 또 바꿉니다. 그럼,

 

  3 5 7 2 1 ...

  이렇게 되지요.

 

  그다음에는 세번째수 7과 다음 2를 비교합니다. 그럼 2가 작으니깐 또 바꿉니다. 그럼,

  3 5 2 7 1 ...

 

  여기까지 이해되시죠? 맨처음부터 두번째 , 두번째수와 세번째수, 세번째수와 네번째수 ... 이렇게 끝까지 비교하면 맨 뒤에 뭐가 남을까요?

  제일큰 숫자가 맨뒤에 남게 됩니다. 여기서는 9가 되겠지요?

 

  그래서 처음실행 결과는

  3 5 2 1 7 8 4 6 0 9

  이렇게 9가 맨뒤로 가게 됩니다.

 

    그다음에 다시 처음부터 비교합니다. 아까와 같은 방법으로요. 근데 이번에는 맨뒤에 제일큰수 9가 가 있으므로 그 앞까지만 비교해도 되겠지요? 그래서 0까지만 비교하게 됩니다. 그럼 다음큰수인 8이 9앞으로 오게 됩니다.

 

  3 2 1 5 7 4 6 0 8 9

  이런식으로요...


  이렇게 자꾸 하다보면 큰숫자가 계속 뒤로 가게되지요. 그러면 끝에는 정렬이 되게 되는 것입니다.

  이게 버블정렬 방법이에요. 별로 어렵지 않지요?

  그럼 소스를 보시죠.

 

#include <iostream.h>

void main()
{
 int num[10];

 cout << "숫자 10개를 띄워서 입력하세요.\n";
 cin >> num[0] >> num[1] >> num[2] >> num[3] >> num[4] >> num[5] >> num[6] >> num[7] >> num[8] >> num[9];
   
 for (int j=9;j>0;j--) {
  for (int i=0;i<j;i++)
  if (num[i]>num[i+1]) {
   int temp;
   temp = num[i];
   num[i]=num[i+1];
   num[i+1]=temp;
  };
 };
 cout << "버블정렬후 : " << num[0] << " " << num[1] << " " << num[2] << " " << num[3] << " " << num[4] << " " << num[5] << " " << num[6] << " " << num[7] << " " << num[8] << " " << num[9] << "\n";
}

 

먼제 int num[10]에서 10개의 숫자를 담는 배열을 선언하구요.
cin에서 10개의 숫자를 띄워쓰기로 입력받습니다.

그다음부분이 정렬메인인데요.

 

 for (int j=9;j>0;j--) {  // 최대 9번에서 0까지 비교
  for (int i=0;i<j;i++)  // 처음부터 j까지 비교
  if (num[i]>num[i+1]) {  // 만약에 뒤의수가 앞의수보다 작으면은
   int temp;            // 바꿔줍니다.
   temp = num[i];
   num[i]=num[i+1];
   num[i+1]=temp;
  };
 };

 

  주석을 보시면 이해가시죠? 바꾸어 주는 부분이 좀 해깔릴수 있는데 여기서 그냥 num[i] = num[i+1] 이렇게 해주면 되지 않느냐고 하실지 모르겠지만
이렇게 해주면 두개가 같아집니다. 예를들어 7과 3이 있는데 num[i]=num[i+1]해주면 num[i]도 3 num[i+1]도 3이 되지요. 7이 없어져버립니다. 그래서
임시변수 temp를 줘서 임시변수에 앞의 수를 저장해놓고 두수를 같게 만든다음 뒤수에 임시변수값을 넣어주는 것입니다.

 

  이해되시지요? 궁금하신 사항은 댓글로 부탁드립니다.

'비주얼C++ > 예제모음' 카테고리의 다른 글

[C++] 완전수 찾기소스  (0) 2014.07.24
삽입정렬  (0) 2012.11.24
선택정렬  (0) 2012.11.24


설정

트랙백

댓글