본문 바로가기
Language/C#

c# 친화수 구하기

by ninanio3 2011. 12. 12.

이것 역시, 논리적으로 접근을 했다. 친화수에 대해서 알아봤다. 친화수의 정의를 위키백과에서 긁어왔다. ㅎㅎ

 친화수(親和數)는 두 수의 쌍이 있어, 어느 한 수의 진약수를 모두 더하면 다른 수가 되는 것을 말한다. 220284의 쌍이 그 예이다. 220의 진약수는 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110로 모두 더하면 284가 된다. 반대로 284의 모든 진약수 1, 2, 4, 71, 142를 모두 더하면 220이 된다.

맨 먼저, 클래스를 만들고 화면에 찍어가면서 220의 약수와 약수의 합이 284가 나오는지 확인을 했다. PrintDivision 클래스가 제대로 작동을 해야 결과값을 비교하면서 입력된 수와 결과값을 다시 더한 수가 같은지 아닌지를 알아볼 수 있기 때문이다.

접근방법은 이러했다.

  1.             //일단 약수의 합을 구한다 //220, 284
  2.             //그 합을 대입해보는 방식.
  3.             //for문이 두 번 들어간다.
  4.             //1.수를 늘려가면서 약수의 합을 구한다.
  5.             //2. 약수의 합을 다시 기존의 수와 비교를 해서 같은지 확인해본다.

그리고 코딩은 이러하다.
아래는 메인이 되는 요체
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using Com.JumBo.Logic;
  7.  
  8. /*
  9.  * 문제 내용 : 1과 10000 사이의 친화수(amicable number)를 구하자.
  10.  * 학습 내용 : 관계 연산자 ==, !=, < <=, >, >=의 활용법을 익힌다.
  11.  * 힌트 내용 : A 약수의 합이 B이고, B 약수의 합이 A일 때 'A와 B는 친화수'라고 한다.
  12.  * */
  13.  
  14.  
  15. namespace Console_Test
  16. {
  17.     public class Program
  18.     {
  19.         static void Main(string[] args)
  20.         {
  21.             Console.WriteLine("친화수를 구해보자");
  22.             //int iNum1 = int.Parse(Console.ReadLine());
  23.             Calc.amic();
  24.             //친화수는 어떻게 구할까..?
  25.         }
  26.     }    
  27. }
그리고 요 아래는 함수가 들어가는 곳...

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Com.JumBo.Logic
  7. {
  8.     public class Calc
  9.     {
  10.         public static int SumDivision(int n)
  11.         {
  12.             //약수의 합 구하기
  13.             int total = 1;
  14.             for (int i = 2; i < n; i++)
  15.             {
  16.                 if (n % i == 0)
  17.                 {
  18.                     total += i;
  19.                 }                
  20.             }
  21.                 return total;
  22.         }
  23.         public static void PrintDivision(int n)
  24.         {
  25.             //모든 약수 출력
  26.             Console.WriteLine("친화수는 {0} 이고 약수는 아래와 같다.", n);
  27.             for (int i = 1; i < n; i++)
  28.             {                
  29.                 if (n % i == 0)
  30.                 {
  31.                     Console.Write("{0} ", i);                    
  32.                 }                
  33.             }            
  34.         }
  35.         //친화수 출력
  36.         public static void amic()
  37.         {
  38.             int iNum1 = 0;
  39.             //일단 약수의 합을 구한다 //220, 284
  40.             //그 합을 대입해보는 방식.
  41.             //for문이 두 번 들어간다.
  42.             //1.수를 늘려가면서 약수의 합을 구한다.
  43.             //2. 약수의 합을 다시 기존의 수와 비교를 해서 같은지 확인해본다.
  44.             for (int i = 2; i <= 10000; i++)
  45.             {
  46.                 iNum1 = SumDivision(i);
  47.                 int iNum2 = SumDivision(iNum1);
  48.                 if (i == iNum2)
  49.                 {
  50.                     if (iNum1 != iNum2)
  51.                     {
  52.                         PrintDivision(iNum1);
  53.                         Console.WriteLine();
  54.                         Console.WriteLine("{0}의 친화수는 {1}이다.\n", iNum1, i);
  55.                     }
  56.                     else
  57.                     {
  58.                         continue;
  59.                     }
  60.                 }
  61.             }
  62.         }
  63.     }    
  64. }
풀이과정까지 보기 위해 촌스러운 주석은 생략하지 않았다. ^^; 부끄럽구요~ -ㅅ-a



이처럼, 친화수를 구하면 10000까지 5쌍, 10개의 친화수가 나온다.
19세기 이전에 친화수는 5개 정도밖에 밝혀지지 않았다. 기사참조(http://kin.naver.com/qna/detail.nhn?d1id=13&dirId=130103&docId=105682033&qb=7Lmc7ZmU7IiY&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gXUH6U5Y7awssbE/TbVssc--157040&sid=TuX3h7HC5U4AAC96BC0) 이제는 위의 코드만 있으면 친화수정도는 쉽게 구한다. ㅎㅎ 변수형을 바꿔주면 더 많은 수를 구할 수 있을 것이다.


이 문제의 출처는 c#프로그래밍 기본기 익히기, 정보문화사, 25000, 조효은지음,

'Language > C#' 카테고리의 다른 글

c# while문의 사용  (0) 2011.12.24
c# switch case 문  (0) 2011.12.20
c# 연산자~!  (0) 2011.12.10
c#, 짝수와 홀수의 합 구하기. c#에서 class를 이용한다.  (2) 2011.12.09
c# break문을 이용하여 소수(Prime)를 구하자!!  (0) 2011.12.08