2009년 04월 07일
[과제] 확장된 유클리드 알고리즘 수행
다소 쉬운 과제라고 생각했으나 %연산으로 나머지를 구하게되면 -2 % 10 의 결과가 -2가 나오는 현상이 발생하기 때문에
[ 나누어지는수 = 몫 * 나누는수 + 나머지 ] 식에서 [몫 * 나누는수] 를 이항하여 나머지를 구하는 함수를 작성하여
해결하였다. 소스코드는 아래와 같다.


[ 나누어지는수 = 몫 * 나누는수 + 나머지 ] 식에서 [몫 * 나누는수] 를 이항하여 나머지를 구하는 함수를 작성하여
해결하였다. 소스코드는 아래와 같다.
// 확장된 유클리드 알고리즘 수행
#include <stdio.h>
#include <math.h>
// 모듈러 함수 -> [나누어지는수 = 몫 x 나누는수 + 나머지] 를 이항을 이용하여
// [나누어지는수 - 몫 x 나누는수 = 나머지] 형태로 하여 나머지를 구한다.
int mod(int a, int b)
{
if (b > 0)
return (int) (a - floor((float) a / (float) b) * b);
else
return (int) (a - ceil((float) a / (float) b) * b);
}
// 포인터를 매개변수로 받아 변수값들을 교환한다.
void shift(int *n1, int *n2, int n)
{
*n1 = *n2;
*n2 = n;
}
int main(int argc, char *argv[])
{
int q, a, b, r; // 몫, 정수1, 정수2, 나머지
int s, s1 = 1, s2 = 0; // s, s1, s2
int t, t1 = 0, t2 = 1; // t, t1, t2
printf("확장된 유클리드 알고리즘을 수행합니다.\n\n");
printf("두 정수를 입력해 주세요 : ");
scanf("%d %d", &a, &b);
printf("\n");
printf("\n 몫 정수1 정수2 나머지 s1 s2 s t1 t2 t\n");
// 알고리즘 수행구간
while (b != 0)
{
q = floor((float)a / (float)b);
r = mod(a, b);
s = s1 - s2 * q;
t = t1 - t2 * q;
printf("%3d %5d %5d %5d %5d %3d %3d %3d %3d %3d\n", q, a, b, r, s1, s2, s, t1, t2, t);
// 값 이동 구간
shift(&a, &b, r);
shift(&s1, &s2, s);
shift(&t1, &t2, t);
}
printf("%9d %5d %11d %11d\n\n", a, b, s1, t1);
return 0;
}


이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- [C] 헤더파일 - stdio.h, math.h, string.h , ctype.h, stdlib.h, time.h by JiunSuk
- [C] swap() 함수를 매크로 작성 (단 한줄) by i0Nucleus
- #4 함수 by 그아이
- GCC 컴파일 할때 생기는 Warning 해결 by 까망군
- 랜덤 알고리즘 파해치기 by S2nNAMU
# by | 2009/04/07 22:24 | 암호수학 | 트랙백 | 덧글(0)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]