보안 스터디/c

증감연산의 과정과 결과에 의문을 느껴서 정리해본다. #include int main() { int a=10; printf("%d %d %d\n",a++,++a,++a); printf("%d %d %d\n",a++,--a,a--); return 0; } 코드는 간단하게 위와 같고 gdb를 통해 간단한 디버깅을 해보았다. 일단 스택이라는 메모리 공간을 사용한다는 것을 알 수 있다. 프롤로그가 진행되고, printf("%d %d %d\n", a++,++a,++a); 의 인자는 뒤에서부터 스택에 쌓인다. a값을 ebp-0x4라는 스택의 밑바닥에 저장하고 뒤의 인자 두개 ++a, ++a 전위연산을 add명령어를 통해 진행한다 10 -> 12가 된 ebp-0x4 값을 eax레지스터에 저장하고 후위 연산이 진행되는데..
1. 정렬하고자 하는 2개 이상의 수를 입력받는다. 2. 가장 왼쪽 인덱스를 기준(pivot)으로 잡고, pivot을 제외한 나머지 인덱스 중 가장 왼쪽 인덱스를 Left, 가장 오른쪽 인덱스를 Right로 잡는다.#pivot은 정렬 하고자 하는 수들의 평균에 가까운 수로 잡는게 좋다 3. P와 비교했을 때, 더 큰 수가 나올때까지 L인덱스를 하나씩 증가시켜준다. 4. P와 비교했을 때, 더 작은 수가 나올때까지 R인덱스를 하나씩 감소시켜준다. 5. L과 R인덱스가 멈추면 두 인덱스를 swap한다. 6. L과 R인덱스가 교차 할 경우, P보다 작은 수와 P를 swap한다 7. 위의 정렬을 재귀하여 반복한다.
알고리즘 스터디 튜터를하게되어 간단하게 다뤄볼만한 알고리즘을 찾던 중 유클리드 호제법이 떠오름 먼저 시간복잡도를 고려하지 않고 직관적으로 최대공약수 코드를 작성해봄 min(n,m)만큼 반복문이 돌아가며 두 수에 모두 나누어 떨어질경우 result에 대입하여 마지막에 출력함 다음은 시간복잡도를 고려한 유클리드 호제법을 사용하여 작성 1. m%n != 0 일 경우 func(m,n) -> func(m,m%n)2. m%n==0일 경우 m과 n의 최대공약수는 n 결과적으로 시간복잡도 O(min(m,n) => O(log(min(m,n)))
뚱졍뚱졍
'보안 스터디/c' 카테고리의 글 목록