이것 역시, 논리적으로 접근을 했다. 친화수에 대해서 알아봤다. 친화수의 정의를 위키백과에서 긁어왔다. ㅎㅎ
친화수(親和數)는 두 수의 쌍이 있어, 어느 한 수의 진약수를 모두 더하면 다른 수가 되는 것을 말한다. 220과 284의 쌍이 그 예이다. 220의 진약수는 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110로 모두 더하면 284가 된다. 반대로 284의 모든 진약수 1, 2, 4, 71, 142를 모두 더하면 220이 된다.
맨 먼저, 클래스를 만들고 화면에 찍어가면서 220의 약수와 약수의 합이 284가 나오는지 확인을 했다. PrintDivision 클래스가 제대로 작동을 해야 결과값을 비교하면서 입력된 수와 결과값을 다시 더한 수가 같은지 아닌지를 알아볼 수 있기 때문이다.
접근방법은 이러했다.
-
//일단 약수의 합을 구한다 //220, 284
-
//그 합을 대입해보는 방식.
-
//for문이 두 번 들어간다.
-
//1.수를 늘려가면서 약수의 합을 구한다.
-
//2. 약수의 합을 다시 기존의 수와 비교를 해서 같은지 확인해본다.
그리고 코딩은 이러하다.
아래는 메인이 되는 요체
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
-
using Com.JumBo.Logic;
-
-
/*
-
* 문제 내용 : 1과 10000 사이의 친화수(amicable number)를 구하자.
-
* 학습 내용 : 관계 연산자 ==, !=, < <=, >, >=의 활용법을 익힌다.
-
* 힌트 내용 : A 약수의 합이 B이고, B 약수의 합이 A일 때 'A와 B는 친화수'라고 한다.
-
* */
-
-
-
namespace Console_Test
-
{
-
public class Program
-
{
-
static void Main(string[] args)
-
{
-
Console.WriteLine("친화수를 구해보자");
-
//int iNum1 = int.Parse(Console.ReadLine());
-
Calc.amic();
-
//친화수는 어떻게 구할까..?
-
}
-
}
-
}
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
-
namespace Com.JumBo.Logic
-
{
-
public class Calc
-
{
-
public static int SumDivision(int n)
-
{
-
//약수의 합 구하기
-
int total = 1;
-
for (int i = 2; i < n; i++)
-
{
-
if (n % i == 0)
-
{
-
total += i;
-
}
-
}
-
return total;
-
}
-
public static void PrintDivision(int n)
-
{
-
//모든 약수 출력
-
Console.WriteLine("친화수는 {0} 이고 약수는 아래와 같다.", n);
-
for (int i = 1; i < n; i++)
-
{
-
if (n % i == 0)
-
{
-
Console.Write("{0} ", i);
-
}
-
}
-
}
-
//친화수 출력
-
public static void amic()
-
{
-
int iNum1 = 0;
-
//일단 약수의 합을 구한다 //220, 284
-
//그 합을 대입해보는 방식.
-
//for문이 두 번 들어간다.
-
//1.수를 늘려가면서 약수의 합을 구한다.
-
//2. 약수의 합을 다시 기존의 수와 비교를 해서 같은지 확인해본다.
-
for (int i = 2; i <= 10000; i++)
-
{
-
iNum1 = SumDivision(i);
-
int iNum2 = SumDivision(iNum1);
-
if (i == iNum2)
-
{
-
if (iNum1 != iNum2)
-
{
-
PrintDivision(iNum1);
-
Console.WriteLine();
-
Console.WriteLine("{0}의 친화수는 {1}이다.\n", iNum1, i);
-
}
-
else
-
{
-
continue;
-
}
-
}
-
}
-
}
-
}
-
}
이처럼, 친화수를 구하면 10000까지 5쌍, 10개의 친화수가 나온다.
19세기 이전에 친화수는 5개 정도밖에 밝혀지지 않았다. 기사참조(http://kin.naver.com/qna/detail.nhn?d1id=13&dirId=130103&docId=105682033&qb=7Lmc7ZmU7IiY&enc=utf8§ion=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 |