본문 바로가기
알고리즘(C언어)/이것이 자료구조+알고리즘이다(박상현)_알고리즘

(7)[Chapter12]분할정복_3_피보나치 수열(작성중)

by 코잼민 2024. 9. 7.

분할정복_3_피보나치수열_이론과 코드노트.pdf
3.40MB

##꽤 어려워 했던 부분 노트 사진 :

 

##핵심 개념(작성중):

##코드 :

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
 
typedef unsigned long ULONG;
 
typedef struct _tagMatrix2x2 
{
    ULONG Data[2][2];
}Matrix2x2;
 
Matrix2x2 Matrix2x2_M(Matrix2x2 A, Matrix2x2 B)
{
    //1_ 반환용 임시 행렬 C선언;
    Matrix2x2 C;
 
    //2_ 곱셈 연산
    C.Data[0][0= A.Data[0][0* B.Data[0][0+ A.Data[0][1* B.Data[1][0];
    C.Data[0][1= A.Data[0][0* B.Data[0][1+ A.Data[0][1* B.Data[1][1];
    C.Data[1][0= A.Data[1][0* B.Data[0][0+ A.Data[1][1* B.Data[1][0];
    C.Data[1][1= A.Data[1][0* B.Data[0][1+ A.Data[1][1* B.Data[1][1];
 
    //3_ C반환
    return C;
}
 
Matrix2x2 Matrix2x2_P(Matrix2x2 A, int N)
{
    //종료 조건 : A^1
    if (N == 1
    {
        return A;
    }
 
    //분할 
    A = Matrix2x2_P(A, N / 2);
 
    //정복 (구현부) (쪼개진 후, 역순으로 조립 생각)
    //A^2 = A^1 X A^1 부터 생각
    A = Matrix2x2_M(A, A);
 
    if (N % 2 != 0) {//N이 홀수 라면, A^1을 한번 더 곱해야 함
        Matrix2x2 B;
 
        B.Data[0][0= 1;
        B.Data[0][1= 1;
        B.Data[1][0= 1;
        B.Data[1][1= 0;
 
        A = Matrix2x2_M(A, B);
    
    }
 
    return A;
 
}
 
//행렬 제곱 후, 01원소 || 10원소만 뽑아내기
ULONG Fibo(int N) 
{
    //행렬 A 선언 ,  초기화
    Matrix2x2 A;
 
    A.Data[0][0= 1;
    A.Data[0][1= 1;
    A.Data[1][0= 1;
    A.Data[1][1= 0;
 
 
    //행렬 A 제곱 연산
    A = Matrix2x2_P(A, N);
 
    //원소 추출, 반환
    return A.Data[0][1];
 
}
 
int main() {
    int N;
    scanf("%d"&N);
 
    printf("F(%d) = %lu\n", N, Fibo(N));
 
    return 0;
}
cs