1 / 55

제 13 장 종합예제

제 13 장 종합예제. 문봉근. 예제 13.1 유클리드 호제법을 이용한 최대공약수 구하기. 유클리드 (Euclid) 호제법을 이용한 두 수의 최대공약수 (greatest common divisor) 구하기 . 예를 들어 다음과 같은 두수가 있다면 , 큰 수에서 작은 수를 빼고 , 그 결과를 다시 다른 수와 비교하여 같은 과정을 반복한다 . a = 56, b = 34 ① 56 - 34 = 22 ( 결과 a = 22, b = 34) ② 34 - 22 = 12 ( 결과 a = 22, b = 12)

dana
Download Presentation

제 13 장 종합예제

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 제13장 종합예제 문봉근

  2. 예제 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 -> 두 수가 같아지면 그 값이 최대공약수이다.)

  3. 예제 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); }

  4. 예제 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); }

  5. 예제 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); }

  6. 예제 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); }

  7. 예제 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); } }

  8. 예제 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)); }

  9. 예제 13.31000 이하의 완전수를 구하기(프로그램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); } } }

  10. 예제 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); }

  11. 예제 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); }

  12. 예제 13.5 호텔에 방이 100개 있으며, 각각 번호가 1부터 100까지 붙어 있고, 사람이 100명 있고 마찬가지로 번호가 1부터 100까지 붙어 있다. 1번 사람이 1번 방부터 지나가면서 방 번호가 자기의 배수에 해당하는 방문이 열려 있으면 닫고, 닫혀 있으면 연다. 마찬가지로 2번 사람도 1번 방부터 지나가면서 자기의 배수에 해당하는 방 번호의 방을 열거나 혹은 닫는다. 이러한 방법으로 사람이 1번부터 100번까지 지나갔을 때 최종 방문은 몇 개가 열려 있는가? 단, 처음에는 모두 닫혀 있다.

  13. 예제 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); }

  14. 예제 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); }

  15. 예제 13.65×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"); } }

  16. 예제 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); } }

  17. 예제 13.1020개 데이터의 표준편차 σ를 구하는 함수 #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)); // 표준편차구하는 함수 호출 }

  18. 예제 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 /= (s-1); // 각수의 제곱의 합을 개수로 나눔 mean = m_mean(dim, s); // 산술평균 구하는 함수 호출.. return 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; // 개수로 나누어 산술평균을 구하여 돌려줌. }

  19. 예제 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("") ; }

  20. 예제 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; }

  21. 예제 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; }

  22. 예제 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)); }

  23. 예제 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; }

  24. 예제 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; }

  25. 예제 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); printf("\n"); bas_epn(1234,16); printf("\n"); bas_epn(1234,24); printf("\n"); bas_epn(1234,32); 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); }

  26. 예제 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"); } }

  27. 예제 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); }

  28. 예제 13.2210진수를 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"); }

  29. 예제 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"); }

  30. 예제 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); }

  31. 예제 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"); }

  32. 예제 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); }

  33. 예제 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'); }

  34. 예제 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); }

  35. 예제 13.232진수를 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를 곱해준다. } printf("2진수 %s의 10진수 값은 %d\n", a, dec); }

  36. 예제 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"); }

  37. 예제 13.25Kaprika구를 구하라. #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); } }

  38. 예제 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); }

  39. 예제 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); }

  40. 예제 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; }

  41. 예제 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); }

  42. 예제 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); }

  43. 예제 13.29pi 구하기 #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++; } }

  44. 예제 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; } }

  45. 예제 13.32210000을 정수로 나타내기 #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 저장, 그렇지 않으면 모두 0으로 나옴*/

  46. 예제 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; } }

  47. 예제 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); } } }

  48. 예제 13.33100!을 정수로 나타내기 #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를 읽음 */

  49. 예제 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; } }

  50. 예제 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); } } }

More Related