PowerPoint 프레젠테이션

Download Report

Transcript PowerPoint 프레젠테이션

제13장 종합예제
문봉근
YES C 제 13 장 종합예제
1/55
예제 13.1 유클리드 호제법을 이용한 최대공약수 구하기
유클리드(Euclid) 호제법을 이용한 두 수의 최대공약수(greatest
common divisor) 구하기. 예를 들어 다음과 같은 두수가 있다면, 큰
수에서 작은 수를 빼고, 그 결과를 다시 다른 수와 비교하여 같은 과
정을 반복한다.
a = 56, b = 34
① 56 - 34 = 22 (결과 a = 22, b = 34)
② 34 - 22 = 12 (결과 a = 22, b = 12)
③ 22 - 12 = 10 (결과 a = 10, b = 12)
④ 12 - 10 = 2 (결과 a = 10, b = 2)
⑤ 10 - 2 = 8 (결과 a = 8, b = 2)
⑥ 8 - 2 = 6 (결과 a = 6, b = 2)
⑦ 6 - 2 = 4 (결과 a = 4, b = 2)
⑧ 4 - 2 = 2 (결과 a = 2, b = 2 -> 두 수가 같아지면
그 값이 최대공약수이다.)
YES C 제 13 장 종합예제
2/55
예제 13.1 (계속) 프로그램1(for와 if사용)
#include <stdio.h>
void main(void)
{
int i, j, x, y;
printf("input x, y : ");
scanf("%d,%d", &i, &j);
x = i;
y = j;
for (;;) {
//세미콜론 두개면 무한 루프가 된다.
if (x > y)
x -= y;
else if(x < y )
y -= x;
else
break;
}
printf("%d와 %d의 최대 공약수는? = %d\n", i, j, x);
}
3/55
YES C 제 13 장 종합예제
예제 13.1 (계속) 프로그램2(조건연산자 ?: 사용)
#include <stdio.h>
void main(void)
{
int i, j, x, y;
printf("input i, j : ");
scanf("%d,%d", &i, &j);
x = i;
y = j;
for (;;) { //세미콜론 두개면 무한 루프가 된다.
if(x == y ) break;
x>y ? (x -=y) : (y -= x);
}
printf("%d와 %d의 최대 공약수는? = %d\n",i,j,x);
}
YES C 제 13 장 종합예제
4/55
예제 13.1 (계속) 프로그램3(while 사용)
#include <stdio.h>
void main(void)
{
int i, j, x, y;
printf("input i, j : ");
scanf("%d, %d", &i, &j);
x = i;
y = j;
while(1) {
if(x == y ) break;
x>y ? (x -=y) : (y -= x);
}
printf("%d와 %d의 최대 공약수는? = %d\n",i,j,x);
}
YES C 제 13 장 종합예제
5/55
예제 13.1 (계속) 프로그램4(while 사용)
#include <stdio.h>
void main(void)
{
int a, b, x, y;
printf("input i, j : ");
scanf("%d,%d", &a, &b);
x = a;
y = b;
while(x!=y)
x>y ? (x -=y) : (y -= x);
printf("%d와 %d의 최대 공약수는? = %d\n",a,b,x);
}
YES C 제 13 장 종합예제
6/55
예제 13.1 (계속) 프로그램7(함수사용)
#include <stdio.h>
int gcm(int, int); // 함수 원형(prototype)
void main(void)
{
int i, j, x;
printf("input i, j : ");
scanf("%d, %d", &i, &j);
x = gcm(i, j);
printf( "%d와 %d의 최대 공약수 = %d\n", i, j, x);
}
int gcm(int a, int b)
{
while(1) {
if(a==b) return a;
(a>b) ? (a-=b) : (b-=a);
}
}
YES C 제 13 장 종합예제
7/55
예제 13.2 최대공약수를 이용한 최소공배수 구하기
#include <stdio.h>
int gcm(int, int); // 함수 원형(prototype)
int lcd(int, int);
void main(void)
{
int i, j;
printf("최소공배수를 구할 두 수를 입력하시오.");
scanf("%d %d", &i, &j);
printf("%d와 %d의 최소공배수는 %d이다.\n",i,j,lcd(i, j));
}
int gcm(int a, int b)
{
while(1) {
if(a==b) return a;
a>b ? (a-=b) : (b-=a);
}
}
int lcd(int x, int y)
{
return (x*y/gcm(x,y));
}
YES C 제 13 장 종합예제
8/55
예제 13.3 1000 이하의 완전수를 구하기(프로그램1)
#include <stdio.h>
void main(void)
{
int i, j, sum;
for (i=2; i <= 1000; i++) {
sum= 0;
// sum을 초기화한다.
for (j=1; j <= i/2; j++) {
// i의 가장 큰 약수(i/2)까지 루프를 돌면서 i의 약수를 구한다.
if (i%j == 0) sum += j;
}
if (i == sum) { // 완전수이면 결과를 출력한다.
printf("%d의 약수는\n",i);
for (j=1; j <= i/2; j++)
if (i % j ==0) printf("%d\n", j);
if (i == sum) printf("%d는 완전수이다.\n\n", i);
}
}
}
YES C 제 13 장 종합예제
9/55
예제 13.3 (계속) 프로그램2(함수사용)
#include <stdio.h>
int isperfect_no(int);
void main(void)
{
int i;
for (i=2; i <= 1000; i++) {
if(isperfect_no(i))
printf("%d는 완전수이다.\n\n", i);
}
}
int isperfect_no(int x)
{
int sum=0, j;
// i의 약수의 합을 구한다.
for (j=1; j <= x/2; j++)
if (x%j == 0) sum += j;
return ((x == sum) ? 1 : 0);
}
YES C 제 13 장 종합예제
10/55
예제 13.4 소수(prime number) 구하기
#include <stdio.h>
#include <math.h>
//sqrt() 함수를 사용하기 위한 인클루드
void main(void)
{
int i, j, prime = 1 ;
printf("숫자를 입력하여 주십시오 : ");
scanf("%d", &j);
for (i=2; i<=(int)sqrt(j); i++) { // i는 2부터 루트j까지
if (j%i == 0) {
prime = 0;
break;
}
}
if (prime == 1)
printf(" %d는 소수이다\n", j);
else
printf(" %d는 소수가 아니다\n", j);
}
YES C 제 13 장 종합예제
11/55
예제 13.5
호텔에 방이 100개 있으며, 각각 번호가 1부터 100까지 붙어
있고, 사람이 100명 있고 마찬가지로 번호가 1부터 100까지
붙어 있다. 1번 사람이 1번 방부터 지나가면서 방 번호가 자기
의 배수에 해당하는 방문이 열려 있으면 닫고, 닫혀 있으면 연
다. 마찬가지로 2번 사람도 1번 방부터 지나가면서 자기의 배
수에 해당하는 방 번호의 방을 열거나 혹은 닫는다. 이러한 방
법으로 사람이 1번부터 100번까지 지나갔을 때 최종 방문은 몇
개가 열려 있는가? 단, 처음에는 모두 닫혀 있다.
YES C 제 13 장 종합예제
12/55
예제 13.5 프로그램1 : define을 1과 -1로 하였을 경우
#include <stdio.h>
#define OPEN 1
#define CLOSE -1
void main(void)
{
int man, i, room[101];
// 배열은 0번부터 시작하므로 0번은 사용하지 않음.
for (i=1; i<=100; i++)
room[i] = CLOSE; //초기화
for (man=1; man<=100; man++)
for (i=1; i<=100; i++)
if (i%man == 0)
room[i] = -room[i];
// 상태를 반대로.
for (i=1; i<100; i++)
if(room[i] == OPEN)
printf("%d는 열려있다.\n", i);
}
YES C 제 13 장 종합예제
13/55
예제 13.5 프로그램2 : define을 1과 0으로 하였을 경우
#include <stdio.h>
#define OPEN 1
#define CLOSE 0
void main(void)
{
int man, i, room[101];
for (i=1; i<=100; i++)
room[i] = CLOSE; //초기화
for (man=1; man<=100; man++)
for (i=1; i<=100; i++)
if (i%man == 0)
if (room[i] == OPEN)
room[i] = CLOSE;
else
room[i] = OPEN;
for (i=1; i<100; i++)
if(room[i] == OPEN)
printf("%d는 열려있다.\n", i);
}
YES C 제 13 장 종합예제
14/55
예제 13.6 5×5 정방행렬의 전치행렬을 구하라.
#include <stdio.h>
void main(void)
{
int i, j, dim[5][5] = {{4,5,7,8,9}, {5,2,4,6,2},
{4,7,8,5,2}, {3,5,8,9,6}, {7,5,6,9,8}};
const int max_count = sizeof(dim)/sizeof(dim[0]);
printf("원래의 행렬\n");
for (i=0; i<max_count; i++) {
for(j=0; j<max_count; j++)
printf(" %d ", dim[i][j]);
printf("\n");
}
printf("\n");
// 전치행렬로 변환하는 과정
for (i=0; i<max_count; i++) {
for(j=0; j<i; j++) { //이 부분은 두개의 데이터를 교환하는 것
dim[i][j] ^= dim[j][i];
dim[j][i] ^= dim[i][j];
dim[i][j] ^= dim[j][i];
}
}
printf("전치 행렬\n");
for (i=0; i<max_count; i++) {
for(j=0; j<max_count; j++)
printf(" %d ", dim[i][j]);
printf("\n");
}
}
YES
C 제 13 장 종합예제
15/55
예제 13.8 랜덤 함수를 이용한 주사위 게임.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void main(void)
{
int i, num, in, seed;
seed = time(NULL);
srand(seed);
for(i=0; i<10; i++) {
num = rand() %6 +1;
printf("수를 입력하시오.(1-6) : ");
scanf("%d", &in);
if( num == in)
printf("축하합니다.\n");
else printf("틀렸습니다. %d입니다.\n", num);
}
}
YES C 제 13 장 종합예제
16/55
예제 13.10 20개 데이터의 표준편차 σ를 구하는 함수
#include <stdio.h>
#include <math.h>
float std_dev(float[], int);
float m_mean(float[], int);
void main(void)
{
float array[20]= { 1.0, 10.0, 11.0, 14.4, 34.0,
23.5, 65.9, 98.0, 29.0, 21.0, 23.0, 43.9,
84.9, 20.8, 48.0, 38.1, 98.8, 10.3, 83.1,
75.9};
printf(" 배열 array의 표준편차는 %f이다. \n",
std_dev(array, 20));
// 표준편차구하는 함수 호출
}
YES C 제 13 장 종합예제
17/55
예제 13.10 (계속)
float std_dev(float dim[], int s) { //표준편차 구하는 함수
int i;
float sum=0, mean;
for(i=0; i<s; i++) // 각 수의 제곱의 합을 구하는 루프
sum += dim[i]*dim[i];
sum /=
mean =
return
// 최종
(s-1);
// 각수의 제곱의 합을 개수로 나눔
m_mean(dim, s); // 산술평균 구하는 함수 호출..
sqrt(sum-mean*mean);
표준편차를 구해서 돌려줌
}
float m_mean(float arr[], int z) { // 산술평균 구하는 함수
int i;
float mean = 0;
for(i=0; i<z; i++)
mean += arr[i];
// 전체 배열의 요소를 모두 합함.
return mean/z;
// 개수로 나누어 산술평균을 구하여 돌려줌.
}
YES C 제 13 장 종합예제
18/55
예제 13.11 약수구하기
#include <stdio.h>
void main(void)
{
int x, i;
printf("정수 하나를 입력하시오 : ");
scanf("%d", &x);
for (i=1; i<=x/2; i++)
x % i== 0 ? printf("%d\n", i) : printf("") ;
}
YES C 제 13 장 종합예제
19/55
예제 13.12 조합구하기
#include <stdio.h>
int combi(int, int);
void main(void)
{
int n=10, p=7;
printf("%d\n", combi(n, p));
}
int combi(int n, int p) {
int i, np; /* np = n - p */
int denominator=1, numerator=1; /* 분모, 분자 */
if( p < n - p ) {
np = p;
p = n - p;
} else
np = n - p;
for(i=n; i>p; i--) /* 분모 계산 */
denominator *= i;
for(i=1; i<=np; i++) /* 분자 계산 */
numerator *= i;
return denominator/numerator;
}
YES C 제 13 장 종합예제
20/55
예제 13.13 순열구하기
#include <stdio.h>
int permu(int, int);
void main(void)
{
int n=10, r=4;
printf("%d\n", permu(n, r));
}
int permu(int n, int r) {
int i;
int denominator=1;
for(i=n; i>n-r; i--)
denominator *= i;
}
YES C 제 13 장 종합예제
21/55
예제 13.14 조합구하기, (재귀함수)
#include <stdio.h>
int comb(int m, int n)
{
return(m==0||n==0||m==n ? 1 :
(comb(m-1,n) + comb(m-1,n-1)));
}
void main(void)
{
printf("%d \n", comb(5, 3));
printf("%d \n", comb(5, 0));
printf("%d \n", comb(5, 5));
}
YES C 제 13 장 종합예제
22/55
예제 13.15 복리 이자 계산하기
#include <stdio.h>
float rate(float, float, int); /* 원금, 이율, 예치기간 */
void main(void)
{
float c = 1000000., r = .055;
int n=20;
printf("%f\n", rate(c, r, n));
}
float rate(float c, float r, int n) {
int i;
float money=1.0;
for(i = 0; i<n; i++)
money *=(1.0 + r);
money *= c;
return money;
}
YES C 제 13 장 종합예제
23/55
예제 13.16 디지털 근 구하기
#include
<stdio.h>
#include
<string.h>
int main(void)
{
int number;
char buffer[10]; /* 최대 자릿수를 10으로 한다.*/
int index; /* 문자열에서의 각 숫자의 위치 */
int len; /* 문자열의 길이. 문자열의 길이가 1이 될 때까지 수행..*/
int tmp_number;
printf(" 숫자를 입력하시오: ");
scanf("%d", &number);
tmp_number=number;
do{
/* 결과의 내용을 형식화된 문자열로 변환한다.*/
sprintf(buffer,"%d", tmp_number);
len=strlen(buffer); /* 문자열의 길이를 구한다.*/
tmp_number=0;
for(index=0; index<len; index++){
/* ASCII값 0을 뺀 값 즉, 정수 1의 자릿수 누적 */
tmp_number+=buffer[index]-'0';
}
} while(tmp_number>9); /* 새로 생성된 숫자가 9이상이면 반복.*/
printf("결과:%d\n", tmp_number);
return 0;
24/55
YES
C 제 13 장 종합예제
}
예제 13.17 진법 변환하기(재귀함수)
#include <stdio.h>
char base[36] = {'0','1','2','3','4','5','6','7','8','9','A',
'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z'};
void bas_epn(int m,int n);
void main(void)
{
bas_epn(324,2);
bas_epn(1234,16);
bas_epn(1234,24);
bas_epn(1234,32);
}
printf("\n");
printf("\n");
printf("\n");
printf("\n");
void bas_epn(int m, int n)
{
if (m>0){
bas_epn(m/n, n);
printf("%c",base[m%n]);
}
else
printf(" %d진수 : ", n);
YES
C 제 13 장 종합예제
}
25/55
예제 13.19 행렬곱셈
#include <stdio.h>
#define M 3
#define P 5
#define N 4
void main(void)
{
float a[M][P]= {{1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3}},
b[P][N] = {{1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4},
{1,2,3,4}},
c[M][N];
int i, j, k;
for(i=0; i<M; ++i)
for(j=0; j<N; ++j)
for(c[i][j]=k=0; k<P; ++k)
c[i][j] += a[i][k] * b[k][j];
for(i=0; i<M; ++i) {
for(j=0; j<N; ++j)
printf("%10.4f ", c[i][j]);
printf("\n");
}
YES C 제 13 장 종합예제
}
26/55
예제 13.21 비트연산자 이용 짝수 판별하기
#include <stdio.h>
int iseven(int m)
{
return(!(m & 1));
}
void main(void)
{
int x=-3;
if(iseven(x))
printf("%d is even.\n", x);
else
printf("%d is odd.\n", x);
}
YES C 제 13 장 종합예제
27/55
예제 13.22 10진수를 2진수로 변환하기
프로그램1
#include <stdio.h>
#include <limits.h>
void main(void) {
int i, size;
int x = 298420394;
size = sizeof(x) * 8;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? printf("1") : printf("0");
x = INT_MAX;
printf("\n%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? printf("1") : printf("0");
printf("\n10진수를 입력하시오 : ");
scanf("%d", &x);
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? printf("1") : printf("0");
printf("\n");
}
YES C 제 13 장 종합예제
28/55
예제 13.22 (계속) 프로그램2 : 함수
#include <stdio.h>
#include <limits.h>
void dec2bin(int);
void main(void) {
int x = 298420394;
dec2bin(x);
x = INT_MAX;
dec2bin(x);
printf("\n10진수를 입력하시오 : ");
scanf("%d", &x);
dec2bin(x);
}
void dec2bin(int x)
{
int size, i;
size = sizeof(int) * 8;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? printf("1") : printf("0");
printf("\n");
}
29/55
YES C 제 13 장 종합예제
예제 13.22 (계속) 프로그램3 : 문자배열과 strcpy, strcat사용
#include <stdio.h>
#include <limits.h>
#include <string.h>
void main(void) {
int i, size;
int x = 298420394;
char binary[33] ="";
size = sizeof(x) * 8;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN&x) ? strcat(binary,"1") : strcat(binary,"0");
printf("%s\n", binary);
strcpy(binary, "");
x = INT_MAX;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN&x) ? strcat(binary,"1") : strcat(binary,"0");
printf("%s\n", binary);
}
YES C 제 13 장 종합예제
30/55
예제 13.22 (계속) 프로그램4 : 프로그램3의 함수버전
#include <stdio.h>
#include <limits.h>
#include <string.h>
void dec2bin(int, char *);
void main(void) {
int x = 298420394;
char binary[33] ="";
dec2bin(x, binary);
printf("%s\n", binary);
strcpy(binary, "");
x = INT_MAX;
dec2bin(x, binary);
printf("%s\n", binary);
}
void dec2bin(int x, char *a)
{
int size, i;
size = sizeof(x) * 8;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? strcat(a,"1") : strcat(a,"0");
YES
C
제
13 장 종합예제
}
31/55
예제 13.22 (계속) 프로그램5 : 문자배열사용, string 함수 사용하
지 않음
#include <stdio.h>
#include <limits.h>
void main(void) {
int i, size;
int x = 298420394;
char binary[33] ="";
size = sizeof(x) * 8;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN&x) ? (binary[i]='1') : (binary[i]='0');
printf("%s\n", binary);
x = INT_MAX;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN&x) ? (binary[i]='1') : (binary[i]='0');
printf("%s\n", binary);
}
YES C 제 13 장 종합예제
32/55
예제 13.22 (계속) 프로그램6 : 프로그램5의 함수버전
#include <stdio.h>
#include <limits.h>
void dec2bin(int, char *);
void main(void) {
int x = 298420394;
char binary[33] ="";
dec2bin(x, binary);
printf("%15d = %s\n", x, binary);
x = INT_MAX;
dec2bin(x, binary);
printf("%15d = %s\n", x, binary);
}
void dec2bin(int x, char *a)
{
int size, i;
size = sizeof(x) * 8;
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? (a[i]='1') : (a[i]='0');
}
YES C 제 13 장 종합예제
33/55
예제 13.22 (계속) 프로그램7 : 문자열포인터, malloc함수 사용
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
void main(void) {
int i, size;
int x = 298420394;
char *binary;
size = sizeof(x) * 8;
binary = malloc(size+1);
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? (binary[i]='1') : (binary[i]='0');
binary[i] = '\0';
printf("%s\n", binary);
x = INT_MAX;
printf("%15d = ", x);
for(i=0; i < size; i++, x<<=1)
(INT_MIN & x) ? (binary[i]='1') : (binary[i]='0');
binary[i] = '\0';
printf("%s\n", binary);
free(binary);
}
YES C 제 13 장 종합예제
34/55
예제 13.23 2진수를 10진수로 변환
#include <stdio.h>
#include <string.h>
void main(void)
{
char a[32];
int i, exp=1, dec=0, size;
printf("2진수 32자리 이하를 입력하시오 : ");
scanf("%s", a);
size = strlen(a);
// 제대로 입력이 되었는지를 검사하는 부분.
if( size > 32 ) {
printf("32자리를 초과하였습니다!!!\n");
exit(0);
}
for(i=0; i<size; i++)
if(!(a[i] == '0' || a[i] == '1')) {
printf("2진수가 아닙니다!!!\n");
exit(0);
}
for(i=size-1;i>=0;i--) { // 2진수의 뒷자리에서부터 카운트 해준다.
// 해당하는 자릿수가 1일 때만 2의 해당 자승을 더해준다.
if(a[i] == '1')
dec |= exp;
exp <<= 1; // 루프를 한번씩 돌 때마다 2를 곱해준다.
}
35/55
%s의 10진수 값은 %d\n", a, dec);
YESprintf("2진수
C 제 13 장 종합예제
}
예제 13.24 임의수 소인수분해
#include <stdio.h>
void main(void)
{
int i=2, x;
printf("임의의 정수를 입력하시오 : ");
scanf("%d", &x);
while(x != 1) {
if(x % i == 0) {
printf("%d ", i);
x /= i;
} else
i++;
}
printf("\n");
}
YES C 제 13 장 종합예제
36/55
예제 13.25 Kaprika구를 구하라.
#include <stdio.h>
void main(void)
{
int x, y, i;
for(i=1000; i<10000; i++) {
x = i/100;
y = i%100;
if(i == (x+y)*(x+y))
printf("%d is kaprika number\n", i);
}
}
YES C 제 13 장 종합예제
37/55
예제 13.26 두 정수의 곱셈을 비트연산자(&, |, <<, >> 등)와 덧셈
연산만으로 계산하는 프로그램을 작성하라.
#include <stdio.h>
void main(void)
{
int i, j, product=0, sign=1;
printf("정수를 입력하시오(i,j) : ");
scanf("%d, %d",&i, &j);
printf("%d * %d", i, j);
if( i * j < 0 ) sign = -1;
if( i < 0 ) i = ~i + 1;
if( j < 0 ) j = ~j + 1;
while ( j >= 1 ) {
if((j & 1) == 1) product += i;
i <<= 1;
// i = i << 1
j >>= 1;
// j = j >> 1
}
if(sign < 0 ) product = ~product + 1;
printf("= %d\n",product);
}
YES C 제 13 장 종합예제
38/55
예제 13.26 프로그램2 : goto사용
#include <stdio.h>
void main(void)
{
int i, j, product=0, sign=1;
printf("정수를 입력하시오(i,j) : ");
scanf("%d, %d",&i, &j);
printf("%d * %d", i, j);
if( i * j < 0 ) sign = -1;
if( i < 0 ) i = ~i + 1;
if( j < 0 ) j = ~j + 1;
here:
if ( j >= 1 ) {
if(j & 1 == 1) product += i;
i <<= 1;
j >>= 1;
goto here;
}
if(sign < 0 ) product = ~product + 1;
printf(" = %d\n",product);
}
YES C 제 13 장 종합예제
39/55
예제 13.26 프로그램3 : 함수버전
#include <stdio.h>
int int_bitwise_multiply(int, int);
void main(void)
{
int i, j, product=0, sign=1;
printf("정수를 입력하시오(i,j) : ");
scanf("%d, %d",&i, &j);
printf("%d * %d", i, j);
printf("= %d\n", int_bitwise_multiply(i,j));
}
int int_bitwise_multiply(int x, int y)
{
int sign=1, product=0;
if( x * y < 0 ) sign = -1;
if( x < 0 ) x = ~x + 1;
if( y < 0 ) y = ~y + 1;
while ( y >= 1 ) {
if((y & 1) == 1) product += x;
x <<= 1;
y >>= 1;
}
if(sign < 0 ) product = ~product + 1;
return product;
YES
C
제
13 장 종합예제
}
40/55
예제 13.27 제곱근 구하기
#include <stdio.h>
void main(void)
{
int i, j;
double l=0, m=0, n=0, p=0, q=0, r=0;
printf("제곱근을 구할 수를 입력하시오 : ");
scanf("%lf", &m);
n = 11;
l = 1.0;
for(i=1; i<=n;i++) {
for(j=1; j<=10; j++) {
p = j*l + r;
q = p * p;
if(q>m) {
r = p -l;
break;
}
}
l = l / 10;
}
printf("sqr %lf = %15.13lf\n", m, r);
}
YES C 제 13 장 종합예제
41/55
예제 13.28 자연수 e계산하기
#include <stdio.h>
void main(void)
{
int n;
double p, s;
s=2.0;
n=2;
p=1.0;
while(1) {
p /= n;
if(p<0.00000000001) break;
s += p;
n++;
}
printf(" e= %15.13lf\n", s);
}
YES C 제 13 장 종합예제
42/55
예제 13.29 pi 구하기
#include <stdio.h>
void arctan(void);
double l=16.0, p, r, s, t, x=5.0, y;
void main(void)
{
arctan();
t=s;
x = 239;
l = 4.0;
arctan();
printf("pi = %15.13lf\n", t-s);
}
void arctan(void) {
int n;
y = x * x;
p = l / x;
s = p;
n= 1;
while(1) {
p /= y;
r = p / (2 * n + 1);
if ( r < 0.00000000001) return;
if ( n - 2* (int)(n/2) > 0)
s -= r;
else
s += r;
n++;
}
YES
C 제 13 장 종합예제
}
43/55
예제 13.30 삼각함수 sine 구하기
#include <stdio.h>
void main(void) {
int n;
double q, r, s, x, y, z, pi=3.141592;
scanf("%lf", &x);
z = pi * x / 180;
y = z * z;
s = z;
n = 1;
q = z;
while(1) {
r = q * y / (2 * n * (2 * n +1 ));
if(r < 0.00000000001 ) {
printf("sin %lf = %lf\n", x, s);
break;
}
if(n - 2 * (int)(n / 2) > 0 )
s -= r;
else
s += r;
n++;
q = r;
}
}
YES C 제 13 장 종합예제
44/55
예제 13.32 210000을 정수로 나타내기
#include <stdio.h>
/* 이부분을 바꾸면 더 많은 자리 수까지 계산할 수 있습니다. 현재는 4000자리까지
만 가능합니다.*/
#define DIM 4000
void main(void)
{
int i, j, pow2[DIM], x, temp;
/* pow2 배열은 계산결과를 나누어서 저장할 장소*/
while(1) {
double power2=1;
for(i=0; i<DIM; i++)
pow2[i] = 0; /* 초기값으로 모두 0을 둠 */
printf("\n현재는 4000자리(2^13280)까지 계산이 가능합니다.\n");
printf("계산할 값을 입력하십시요(음수 : exit) : ");
scanf("%d", &x);
/* x!의 x를 읽음 */
if(x>13281) {
/* 2^13281 이상이면 그냥 끝냄 위의 DIM이 수정되면
이 부분도 수정하여야 함 */
printf("%d!은 계산할 수 없습니다.\n", x);
return;
} else if( x < 0 )
break;
pow2[DIM-1]=1; /*맨마지막 배열 요소에 초기값 1 저장,
45/55
YES C 제 13 장 종합예제 그렇지 않으면 모두 0으로 나옴*/
예제 13.32 (계속)
for(i=1; i<=x; i++) {
for(j=DIM-1; j>=0; j--)
/* 정해진 순서에 따라 모든 자리수에 값을 곱한다.*/
pow2[j] *= 2;
for(j=DIM-1; j>=0; j--) {
/* 10이상 자리를 계산 */
temp = pow2[j] / 10;
/* 10미만 자리만 남기고 */
pow2[j] = pow2[j] % 10;
/* 10이상되는 수를 윗자리로 넘겨서 더함 */
pow2[j-1] += temp;
}
}
YES C 제 13 장 종합예제
46/55
예제 13.32 (계속)
for(i=0; i<DIM; i++)
/* 앞자리가 0이면 출력하지 않기 위하여, 어디까지가 0인지 계산 */
if (pow2[i] != 0) {
j=i;
break;
}
printf("\n정수값 2^%d = \n",x);
printf("%d",pow2[j]); /*앞쪽의 0을 제외한 첫째자리 출력*/
for ( i=j+1; i <DIM; i ++)
/* 나머지 자리 출력 */
printf("%1d", pow2[i]);
if(x>1023) { /* double로써 계산할 수 없으면 끝낸다. */
printf("\n\ndouble float로써 계산할 수 있는 값은");
printf(" 최대 2^1023입니다.\n");
printf("그러므로 2^%d은 계산할 수 없습니다.\n", x);
} else { /* double로써 계산할 수 있으면 계산한다. */
for ( i=1; i<=x; i++) power2 *= 2;
printf("\n\n실수값(double float)\n ");
printf("2^%d=%20.16e\n", x, power2);
}
}
}
YES C 제 13 장 종합예제
47/55
예제 13.33 100!을 정수로 나타내기
#include <stdio.h>
/* 이부분을 바꾸면 더 많은 자리 수까지 계산할 수 있습니다. 현재는 4000자리까지
만 가능합니다.*/
#define DIM 4000
void main(void)
{
int i, j, fact[DIM], x, temp;
/* fact배열은 계산결과를 나누어서 저장할 장소*/
while(1) {
double factorial=1;
for(i=0; i<DIM; i++)
fact[i] = 0; /* 초기값으로 모두 0을 둠 */
printf("\n\n현재는 4000자리(1463!)까지 계산이 가능합니다.\n");
printf("계산할 값을 입력하십시오(0 : exit) : ");
scanf("%d", &x);
/* x!의 x를 읽음 */
YES C 제 13 장 종합예제
48/55
예제 13.33 (계속)
/* 1463!이상이면 그냥 끝냄 위의 DIM이 수정되면 이 부분도
수정하여야 함 */
if(x>1463) {
printf("%d!은 계산할 수 없습니다.\n", x);
return;
} else if( x <= 0 )
break;
/*맨마지막 배열 요소에 초기값 1 저장, 그렇지 않으면 모두 0으로 나옴*/
fact[DIM-1]=1;
for(i=1; i<=x; i++) {
for(j=DIM-1; j>=0; j--) {
/* 정해진 순서에 따라 모든 자리수에 값을 곱한다.*/
fact[j] *= i;
}
for(j=DIM-1; j>=0; j--) {
temp = fact[j] / 10; /* 10이상 자리를 계산 */
fact[j] = fact[j] % 10;/* 10미만 자리만 남기고 */
/* 10이상 되는 수를 윗자리로 넘겨서 더함 */
fact[j-1] += temp;
}
}
YES C 제 13 장 종합예제
49/55
예제 13.33 (계속)
/* 앞자리가 0이면 출력하지 않기 위하여, 어디까지가 0인지 계산 */
for(i=0; i<DIM; i++)
if (fact[i] != 0) {
j=i;
break;
}
printf("\n정수값 %d! = \n",x);
printf("%d",fact[j]); /*앞쪽의 0을 제외한 첫째자리 출력*/
for ( i=j+1; i <DIM; i ++)
/* 나머지 자리 출력 */
printf("%1d", fact[i]);
if(x>170) { /* double로써 계산할 수 없으면 끝낸다. */
printf("\n\ndouble float로써 계산할 수 있는 ");
printf("값은 최대 170!입니다.\n");
printf("그러므로 %d!은 계산할 수 없습니다.\n", x);
} else { /* double로써 계산할 수 있으면 계산한다. */
for ( i=1; i<=x; i++)
factorial *= i;
printf("\n\n실수값(double float)\n ");
printf("%d!=%20.16e\n", x, factorial);
}
}
}
YES C 제 13 장 종합예제
50/55
예제 13.34 파일(data.txt)에 있는 학생의 이름을 오름차순 정렬하여 새
로운 파일(sdata.txt)을 생성하는 코드를 작성하세요.
만약 -d라는 옵션이 들어가면 내림차순 정렬한다.
#include <stdio.h>
#define REVERSE
-1
#define NORMAL
1
#define MAXLINENO 100
#define MAXCNO
80
#define TRUE
EOF*-1
/*내림차순*/
/*오름차순*/
int main(int argc, char *argv[])
{
static char text[MAXLINENO][MAXCNO]; /*파일의 내용을 읽어와
저장한다*/
char t[MAXCNO]; /* temporary */
FILE *fp1, *fp2;
int direction = NORMAL; /* 1 ascending,
int no = 0; /* line count로 사용한다 */
int i, j;
YES C 제 13 장 종합예제
-1 descending */
51/55
예제 13.34 (계속)
if ((argc!=3 && argc!=4) || (argc==4 && strcmp(*(argv+1),"-d")))
{
fprintf(stderr,"USAGE: %s [-d] filename(1) filename(2)\n",
*argv);
return (1);
}
if (argc == 4)
{
/* -d을 주면 역으로 정렬
direction = REVERSE;
++argv;
}
*/
if ((fp1 = fopen(*++argv, "r")) == NULL)
{
fprintf(stderr,"Error: Cannot open %s\n",*argv);
return (2);
}
YES C 제 13 장 종합예제
52/55
예제 13.34 (계속)
if ((fp2 = fopen(*++argv, "w")) == NULL) {
fprintf(stderr,"Error: Cannot create %s\n",*argv);
return (3);
}
while (get_line(fp1, text[no++]) != EOF);
for (i = 0; i < no - 2; i++)
for (j = i + 1; j < no - 1; j++)
if (strcmp(text[i], text[j]) * direction > 0)
{
strcpy(t, text[i]);
strcpy(text[i], text[j]);
strcpy(text[j], t);
}
for (i = 0; i < no - 1; i++)
fprintf(fp2,"%s\n",text[i]);
fclose(fp1);
fclose(fp2);
}
YES C 제 13 장 종합예제
53/55
예제 13.34 (계속)
int get_line(FILE *fp, char *s)
{
char *cp = s;
while ((*s = getc(fp)) != EOF)
if (*s == '\n')
{
*s = '\0';
return (TRUE);
}
else
++s;
if (cp == s)
return (EOF);
*s = '\0';
return (TRUE);
}
YES C 제 13 장 종합예제
54/55
예제 13.35 배열에서 2진 검색을 이용하여 자료 찾기
#include <stdio.h>
#define N 10
int bsearch(int v[], int x, int left, int right) {
int mid;
if(left > right) return -1;
mid = (left+right)/2;
if(v[mid] == x) return mid;
else if(v[mid] < x)
bsearch(v, x, mid+1, right);
else
bsearch(v, x, left, mid-1);
}
void main(void)
{
int a[N] = {2, 5, 6, 7, 9, 11, 12, 15, 19, 34}, x, n;
printf("찾을 데이터를 입력하시오 : ");
scanf("%d", &x);
n = bsearch(a, x, 0, N-1) + 1;
if( n > 0)
printf("%d은(는) %d번째에 있습니다. \n", x, n);
else
printf("찾으시는 데이터 %d는 없습니다.\n", x);
}
YES C 제 13 장 종합예제
55/55