728x90

유클리드 호제법 : 기원전 300년경 기하학자 유클리드가 주장하여 그의 이름을 딴 공식으로 알려져 있다.
두 자연수 A,B에 대하여 A를 B로 나누었을 때 몫을 Q, 나머지를 R이라고 하면(A = BQ+R)
A,B의 최대공약수는 B,R의 최대공약수와 같다.
<증명> A,B 둘의 최대공약수 G
A = aG, B = bG (a,b는 서로소)
(A = BQ+R, B = bG 이므로)
bGQ+R = aG
=> R = (a - bQ)G
--------------------------
A = aG
B = bG
R = (a-bQ)G
그러므로 A,B의 최대공약수와 B,R의 최대공약수는 G로 서로 같다.

========================================================================
#include <stdio.h>
unsigned int gcd(unsigned int valuer1, unsigned int value2);
unsigned int lcm(unsigned int value1, unsigned int value2);

int main()
{
    unsigned int value1, value2;
    printf("자연수 2개를 입력하시오 : ");
    scanf("%d %d", &value1, &value2);
    printf("최대공약수 : %d\n", gcd(value1, value2));
    printf("최소공배수 : %d\n", lcm(value1, value2));
    return 0;
}



int lcm(int value1, int value2)
{
        int temp;
        temp = gcd(number1, number2);
        return (number1/temp)*number2;
}

======================================================================
위의 소스는 우선 돌아가는 것 같지만 약점이 있다.
입력값을 전혀 체크하지 않는다는 것! 만약 자연수를 입력하지 않는다면 문제가 발생할 가능성이 크다.
0 0을 입력한다면? 만약 수를 입력하지 않고 문자를 입력해 버린다면?
간단히 오류체크를 추가해서 main을 바꿔보자.

int main()
{
    unsigned int value1, value2;
    do{
        printf("자연수 2개를 입력하시오 : ");
        scanf("%d %d", &value1, &value2);
    }while(value1 <= 0 || value2 <= 0);
    printf("최대공약수 : %d\n", gcd(value1, value2));
    printf("최소공배수 : %d\n", lcm(value1, value2));
    return 0;
}

간단히 do-while을 사용해서 자연수가 아닌 정수(0,음수)는 걸러주도록 했다.
숫자 이외의 값이 입력되는 경우는 찾아보기 쉽게 다른 글로 다시 써야겠다.

728x90
728x90

#include <stdio.h>

unsigned long factorialUsingRecursion(unsigned long n);
unsigned long factorialUsingLoof(unsigned long n);

int main(void)
{
        printf("10! = %lu\n", actorialUsingRecursion(10));
        printf("10! = %lu\n", factorialUsingLoof(10));
        return 0;
}

// 재귀호출을 이용한 factorial계산
// 종료조건(if)을 가장 먼저 적어주는 것에 유의
// 재귀호출은 어떻게 돌아가는지가 중요한 것이 아니라
// 어떤 수식을 그대로 옮겼느냐만 생각하면 된다.
unsigned long factorialUsingRecursion(unsigned long n)
{
        if(n <= 1) return 1;
        return(n*factorial(n-1));
}

unsigned long factorialUsingLoof(unsigned long n)
{
        unsigned long result, i;

        result = 1;
        for(i=2; i<=n; i++)
        {
                result = result * i;
        }
        return result;
}

728x90
728x90
 

{
 int a[3][2]= { {1,2},{3,4},{5,6}};
 int *ptr;
 int i;

 ptr=a[0];
 for(i=0;i<6;i++)
  printf("*(ptr+%d)= %d\n",i,*(ptr+i));
 getch();
}



결과값:

*(ptr+0)=1

*(ptr+1)=2

*(ptr+2)=3

*(ptr+3)=4

*(ptr+4)=5

*(ptr+5)=6


오늘 학교에서 배운 내용입니다..


오늘 처음 들어간 포인터 문인데... 포인터 문을 제대로 이해 안하면


나중에 난해 하다고 하시길래 이왕 할거 제대로 하고 싶어 이렇게 질문을 남깁니다..


 


int a[3][2]= { {1,2},{3,4},{5,6}};


여기서 a[3][2] 는 배열문으로 3행 2열의 정수 배열이라고 하시더군요..


그러면 { {1,2},{3,4},{5,6}}; 여기서 행은 뭐고 열은 또 먼가요..??


또한 제가 a[3][3] 이렇게 고쳐 보니

*(ptr+0)=1

*(ptr+1)=2

*(ptr+2)=0

*(ptr+3)=3

*(ptr+4)=4

*(ptr+5)=0


이렇게 나옵니다... 죄송하지만 이게 왜 이렇게 되는지 자세히 설명해주세요..^^;;


728x90

+ Recent posts