c언어 int string 변환

알고리즘 2014. 10. 22. 06:06


1
2
3
4
5
6
7
8
9
int len = sprintf(buf, "%d", a);
int aaa = 0;
int power = 1;
 
for(int i=0; i<len; i++)
{
    aaa += (buf[len-i-1] - '0') * (power);
    power *= 10;
}


c언어 시계방향으로 최소값 구하기

알고리즘 2014. 10. 22. 06:04


1
2
3
4
5
6
7
8
9
10
int data = 1526;
int size = 3;
int min = INT_MAX;
 
for(int i=0; i<=size; i++)
{
   data = (data%1000) * 10 + data/1000;
   if(min>data)
     min = data;
}


'알고리즘' 카테고리의 다른 글

c언어 int string 변환  (0) 2014.10.22
문자열 비교(strcmp)  (0) 2014.10.22
c언어 char int변환  (0) 2014.10.22
int 형 데이터 자리수 구하기  (0) 2014.10.22
C언어 최대공약수 최소공배수 구하기  (0) 2014.10.22

문자열 비교(strcmp)

알고리즘 2014. 10. 22. 06:02


1
2
3
4
5
6
int strcmp(const char *a, const char *b)
/*
a > b 이면 리턴값 양수
a < b 이면 리턴값 음수
a == b 이면 리턴값 0
*/


c언어 char int변환

알고리즘 2014. 10. 22. 06:01

 


1
2
3
4
char c = '1';
int i;
 
i = c-'0';


'알고리즘' 카테고리의 다른 글

c언어 시계방향으로 최소값 구하기  (0) 2014.10.22
문자열 비교(strcmp)  (0) 2014.10.22
int 형 데이터 자리수 구하기  (0) 2014.10.22
C언어 최대공약수 최소공배수 구하기  (0) 2014.10.22
동적계획법  (0) 2014.01.28

int 형 데이터 자리수 구하기

알고리즘 2014. 10. 22. 06:00


1
2
3
4
5
6
7
8
9
10
11
12
// int형 데이터 자리수 구하기
// 10으로 계속 나누어 자리수를 구한다.
 
int len = num;
int count = 0;
do {
    num = int(num/10);
    count++;    
}while(num > 0)
 
// 출력
printf("자리수 = %d\n", count);


'알고리즘' 카테고리의 다른 글

c언어 시계방향으로 최소값 구하기  (0) 2014.10.22
문자열 비교(strcmp)  (0) 2014.10.22
c언어 char int변환  (0) 2014.10.22
C언어 최대공약수 최소공배수 구하기  (0) 2014.10.22
동적계획법  (0) 2014.01.28

C언어 최대공약수 최소공배수 구하기

알고리즘 2014. 10. 22. 05:58


1
2
3
4
5
6
7
8
9
10
11
12
13
// 최대 공약수
int gcd(int a, int b)
{
    if(b == 0)
      return a;
    gcd(b, a%b);       
}
 
// 최소 공배수
int lcm(int a, int b)
{
   return a * b / gcd(a, b);    
}


'알고리즘' 카테고리의 다른 글

c언어 시계방향으로 최소값 구하기  (0) 2014.10.22
문자열 비교(strcmp)  (0) 2014.10.22
c언어 char int변환  (0) 2014.10.22
int 형 데이터 자리수 구하기  (0) 2014.10.22
동적계획법  (0) 2014.01.28

동적계획법

알고리즘 2014. 1. 28. 02:54

 동적 계획법은 문제를 분할하고 부분 문제의 해를 구한 뒤 구해야 할 해를 부분 문제의 해를 이용해서 구하는 방법이다. 이 때 부분 문제의 해는 배열에 기억시켜 놓은 뒤에 재활용한다. 분할 정복과 비슷하다고 생각할지 모르겠다.

아래의 글을 보고 둘 사이의 차이점을 이해해 보자.

 

▶분할 정복법과 동적 계획법을 이용한 n!구하기

1) 분할정복법

int fact(int n);
main()
{
	int n, k;
	table[1] = 1;
	scanf("%d", &n);
	k = fact(n);
}

int fact(int n)
{
	int i;
	if(n < 1) return 1;
	k = n * fact(n-1);
	return k;
} 

2) 동적계획법

void fact(int n);
main()
{
	int n;
	table[1] = 1;
	scanf("%d", &n);
	fact(n);
}

void fact(int n)
{
	int i;

	for(i=2; i <=n;  i++)
        	table[i] = i * table[i-1];
} 

 

 

              <동적계획법>

위의 펙토리얼 프로그램은 n!의 값을 분할정복법과 동적계획법의 과정을 나타낸다.동적 계획법을 이용한 프로그램은 최종 결과값을 만들기 위해 처음부터 하나씩 해결해서 배열에 넣는다. 그렇게 구한 값을 이용하여 최종 결과값을 얻게 된다. 

 

          <분할정복법>

 반면, 분할정복법으로 짜여진 프로그램은 값을 구하기 위해 부분 문제의 해를 구하고, 그 부분문제의 해를 구하기 위해 부분 문제의 부분 문제의 해를 구하는 방식으로 동작한다.

void table[100];
main()
{
	table[0] = 1;
	table[1] = 1;
	scanf("%d", &n);
	fi(n);
}

void fi(int n)
{
	int i;
	for(i=2; i<=n; i++)
        	table[i]:=table[i-1]+table[i-2];
}

 

피보나치 수열을 구하기 위한 점화식은 F(n) = F(n-1) + F(n-2) 이다. 배열을 이용하여 F(1) + F(2), F(2) + F(3), ..., F(n-1) + F(n-2)를 구하는 방식으로 값을 구하였다. 분할 정복법에서는 F(n) = F(n-1) + F(n-2)에서 시작하여 F(n-1)과 F(n-2)를 각각 구한뒤 마지막에 결과를 합치는 방식으로 문제를 푼다.

 

분할정복법 : 큰 문제를 부분으로 분할하여 각각의 부분 문제를 해결한뒤 결과를 모음

▶ 동적계획법 : 작은 문제를 하나하나 계산하여 원하는 결과에 도달