[2]

ucf·2020년 9월 30일
0

알고리즘&자료구조

목록 보기
3/13

1. 배열 요소의 최댓값 구하기

int maxnum(int a[], int n){
	int i;
    int max = a[0];
    for(i=1; i<n; i++){
    	if(a[i] > max) max = a[i];
    }
    return max;
}

2. 난수

(난수 생성 예제)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
        int i;

        srand(time(NULL)); //시간으로 난수의 seed값 초기화
        i = 100+rand()%90; //100~189의 난수생성
        printf("%d",i);
}

컴퓨터에서 생성되는 난수는 진짜 난수가 아니기 때문에(seed값과 컴퓨터 환경이 같다면 결과가 같음)
시간값을 seed값으로 srand함수에 전달하게되면 일반적인 난수가 생성됨

3. 배열 요소 역순 정렬

int i;
for(i=0; i<n/2; i++){
	int t = a[i];
    a[i] = a[n-i-1];
    a[n-i-1] = t;
}

(매크로를 사용한 방법)

#define swap(type, x, y) do{ type t = x; x=y; y=t;} while(0)

매크로의 정의에서 do while을 사용한이유는 do while문을 사용하지않았을경우

if(a>b) swap(int,a,b);
else swap(int,a,c);

위와같은 부분이

if(a>b) { type t=a; a=b; b=t; } ;
else {type t=a; a=c; c=t; } ;

위와 같은 형식으로 바뀌어 첫번째 if(a>b) 구문에서 ;(세미콜론)으로 인하여 if문이 종료가된다.
따라서 컴파일 에러가 발생하기 때문에 do while(0)을 사용하여 해결한다.

4. 기수 변환

기수의 정의: 수를 나타내는데 기초가 되는 수. 10진법에서는 0~9.
서수의 정의: 사물의 순서. ex) 첫째, 둘째 ...

10진수
1의 자리 - 0부터 9까지 10종류의수
2의 자리 - 0부터 99까지 100종류의 수
3의 자리 - 0부터 999까지 1000종류의 수
(아랫자리부터 10^0, 10^1, 10^2, ... 으로 10의 거듭제곱 값을 갖는다)

따라서 10진수 3333은 다음과 같이 풀어쓸 수 있다

3333 = 3 x 10^3 + 3 x 10^2 + 3 x 10^1 + 3 x 10^0

8진수
1의자리 - 0부터 7까지 8종류의 수
2의자리 - 0부터 77까지 64종류의 수
3의자리 - 0부터 777까지 512종류의 수
(아랫자리부터 8^0, 8^1, 8^2, ... 으로 8의 거듭제곱 값을 갖는다)

따라서 8진수 3333은 다음과 같이 풀어쓸 수 있다.

3333 = 3 x 8^3 + 3 x 8^2 + 3 x 8^1 + 3 x 8^0

위와같은 방식으로 16진수 3333의 표현은 다음과 같다.

16진수
3333 = 3 x 16^3 + 3 x 16^2 + 3 x 16^1 + 3 x 16^0

※ 0x로 시작할 경우 16진수(0x1C), 0으로 시작할경우 8진수(034) 이외에는 10진수로 간주할 수 있다.

기수 변환 알고리즘은 다음과 같다.

//x를 n진수로 변환하여 배열 arr에 아랫자리부터 저장
int change(unsigned x, int n, char arr[]){
   char cl[] = "0123456789ABCDEFGHIJKLMNOPQRSTUWXYZ";
   int count = 0; //변환 후 자릿수
    
    if(x == 0) arr[count++] cl[0];
    else
    	while(x){
            arr[count++] = cl[x % n]; //나머지를 저장한다.
            x /= n; //몫을 나눈다
        }
    return count;
}
profile
즐기자!

0개의 댓글