560 likes | 894 Views
제 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)
E N D
제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) ③ 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 -> 두 수가 같아지면 그 값이 최대공약수이다.)
예제 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); }
예제 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); }
예제 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); }
예제 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); }
예제 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); } }
예제 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)); }
예제 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); } } }
예제 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); }
예제 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); }
예제 13.5 호텔에 방이 100개 있으며, 각각 번호가 1부터 100까지 붙어 있고, 사람이 100명 있고 마찬가지로 번호가 1부터 100까지 붙어 있다. 1번 사람이 1번 방부터 지나가면서 방 번호가 자기의 배수에 해당하는 방문이 열려 있으면 닫고, 닫혀 있으면 연다. 마찬가지로 2번 사람도 1번 방부터 지나가면서 자기의 배수에 해당하는 방 번호의 방을 열거나 혹은 닫는다. 이러한 방법으로 사람이 1번부터 100번까지 지나갔을 때 최종 방문은 몇 개가 열려 있는가? 단, 처음에는 모두 닫혀 있다.
예제 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); }
예제 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); }
예제 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"); } }
예제 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); } }
예제 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)); // 표준편차구하는 함수 호출 }
예제 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; // 개수로 나누어 산술평균을 구하여 돌려줌. }
예제 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("") ; }
예제 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; }
예제 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; }
예제 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)); }
예제 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; }
예제 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; }
예제 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); }
예제 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"); } }
예제 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); }
예제 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"); }
예제 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"); }
예제 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); }
예제 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"); }
예제 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); }
예제 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'); }
예제 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); }
예제 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); }
예제 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"); }
예제 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); } }
예제 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); }
예제 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); }
예제 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; }
예제 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); }
예제 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); }
예제 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++; } }
예제 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; } }
예제 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으로 나옴*/
예제 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; } }
예제 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); } } }
예제 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를 읽음 */
예제 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; } }
예제 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); } } }