| [ QuizWit ] in KIDS 글 쓴 이(By): guest (guestest) <han222.htc.hanw> 날 짜 (Date): 1998년 7월 21일 화요일 오후 02시 34분 00초 제 목(Title): [수식계산] 소스 올립니다... 안녕하세요~~! 제가 만든 source code를 봐 주시겠다니 저야 영광이죠~~~! 근데 이거... 이렇게 올려도 되나 모르겠네요 아무튼 삭제하라고 하시면 즉시 지우겠습니다. 우선은 사칙연산하는 부분만 정리하여 올립니다. - - - - - - - - - - - - - - - - - - - - - - - #include <stdio.h> #include <string.h> #include <malloc.h> #define MAX 100 typedef unsigned char byte; byte *buffer(int factor); void print(byte *p); void plus(byte *result, int value, int position); void increase(byte *result, int value, int position); void copy(byte *source, byte *dest); int get(byte *p, int location); int length(byte *p); void str2buf(byte *str, byte *buf); int compare(byte *num1, byte *num2); void delzero(byte *result); void delsign(byte *p); void addsign(byte *p); byte checksign(byte *p); byte *add(byte *a, byte *b); byte *subtract(byte *a, byte *b); byte *multiple(byte *a, byte *b); void downward(byte *p, int value); byte *divide(byte *a, byte *b); byte *calculate(byte *a, byte op, byte *b); byte *buffer(int factor) { int i; byte *p; p=malloc(MAX); for(i=0;i<MAX;i++) *(p+i)=factor; return p; } void print(byte *p) { byte *start; start=p; while(*p!=10) p++; if(*(p-1)==11) { printf("-"); p--; } else if(*(p-1)==12) { printf("\nDivide By Zero Error!\n"); return; } while(p!=start) printf("%d",*--p); } void plus(byte *result, int value, int position) { do { if(*(result+position)==10) *(result+position)=0; value = *(result+position) + value; if(value>=10) { value=value%10; *(result+position)=value; value=1; position++; } else { *(result+position)=value; value=0; } } while(value==1); } void increase(byte *result, int value, int position) { int i1,i2; if(value>=10) { i1=value%10; i2=value/10; plus(result, i1,position); plus(result, i2,position+1); } else plus(result, value,position); } void copy(byte *source, byte *dest) { int i=0; while(*(source+i)!=10) { *(dest+i)=*(source+i); i++; } *(dest+i)=10; } int get(byte *p, int location) { if(*(p+location)!=10) return *(p+location); else return 0; } int length(byte *p) { int i=0; while(*p++!=10) i++; return i; } void str2buf(byte *str, byte *buf) { unsigned int i=0; byte *temp; temp=str; while(*temp != '\0') temp++; do { temp--; *(buf+i)=*temp-48; i++; } while(temp != str); *(buf+i)=10; // end of buffer... } int compare(byte *num1, byte *num2) { byte *tempnum1, *tempnum2; if(length(num1) > length(num2)) return 0; else if(length(num1) < length(num2)) return 1; else { tempnum1=num1; tempnum2=num2; while(*tempnum1!=10) tempnum1++; while(*tempnum2!=10) tempnum2++; do { tempnum1--; tempnum2--; if(*tempnum1 > *tempnum2) return 0; else if(*tempnum1 < *tempnum2) return 1; } while(tempnum1 != num1); } return 0; } void delzero(byte *p) { byte *temp; temp=p; while(*temp!=10) temp++; temp--; while(*temp==0 && temp!=p) *temp--=10; } void delsign(byte *p) { byte *temp; temp=p; while(*temp!=10) temp++; if(*(temp-1)==11) *(temp-1)=10; } void addsign(byte *p) { byte *temp; temp=p; while(*temp!=10) temp++; if(*(temp-1)!=11) { *temp=11; *(temp+1)=10; } } byte checksign(byte *p) { byte sign, *temp; temp=p; while(*temp!=10) temp++; if(*(temp-1)==11) // minus value... return 1; else return 0; } byte *add(byte *a, byte *b) { int i=0; byte *result; result=buffer(10); if(checksign(a)==0 && checksign(b)==1) // (+a) + (-b) { delsign(b); result=subtract(a,b); } else if(checksign(a)==1 && checksign(b)==0) // (-a) + (+b) { delsign(a); result=subtract(b,a); } else if(checksign(a)==1 && checksign(b)==1) // (-a) + (-b) { delsign(a); delsign(b); result=add(a,b); addsign(result); } else // (+a) + (+b) { while(*(a+i)!=10 || *(b+i)!=10) { increase(result, get(a,i) + get(b,i), i); i++; } } return result; } byte *subtract(byte *a, byte *b) { int i, sign; byte *result, *borrow, *p; byte *tempa, *tempb; result=buffer(10); borrow=buffer(0); tempa=buffer(10); tempb=buffer(10); if(checksign(a)==0 && checksign(b)==1) // (+a) - (-b) { delsign(b); result=add(a,b); } else if(checksign(a)==1 && checksign(b)==0) // (-a) - (+b) { delsign(a); result=add(a,b); addsign(result); } else if(checksign(a)==1 && checksign(b)==1) // (-a) - (-b) { delsign(a); delsign(b); result=subtract(b,a); } else // (+a) - (+b) { if(compare(a, b) == 0) { copy(a, tempa); copy(b, tempb); sign=0; } else { copy(a, tempb); copy(b, tempa); sign=1; } i=0; while(*(tempa+i)!=10) { if( (get(tempa,i) - get(tempb,i)) >= 0 ) increase(result, get(tempa,i) - get(tempb,i), i); else { increase(result, get(tempa,i) - get(tempb,i) + 10, i); *(borrow+i+1) = 1; } i++; } i=0; while(*(result+i) != 10) { if( (*(result+i) - *(borrow+i)) < 0 ) { *(result+i) = *(result+i) - *(borrow+i) + 10; *(borrow+i+1) = 1; } else *(result+i) = *(result+i) - *(borrow+i); i++; } delzero(result); if(sign==1) // if minus value... addsign(result); } free(borrow); free(tempa); free(tempb); return result; } byte *multiple(byte *a, byte *b) { int i, j, lengtha, lengthb; byte *result; result=buffer(10); if(checksign(a)==0 && checksign(b)==1) // (+a) * (-b) { delsign(b); result=multiple(a,b); addsign(result); } else if(checksign(a)==1 && checksign(b)==0) // (-a) * (+b) { delsign(a); result=multiple(a,b); addsign(result); } else if(checksign(a)==1 && checksign(b)==1) // (-a) * (-b) { delsign(a); delsign(b); result=multiple(a,b); } else // (+a) * (+b) { lengtha=length(a); lengthb=length(b); for(i=0;i<lengtha;i++) for(j=0;j<lengthb;j++) increase(result, get(b,j)*get(a,i),i+j); delzero(result); } return result; } void downward(byte *p, int value) { byte *temp; temp=p; while(*temp!=10) temp++; *(temp+1)=10; while(temp!=p) { *temp=*(temp-1); temp--; } *temp=value; delzero(p); } byte *divide(byte *a, byte *b) { int i, point; byte *result, *temp, *subtemp, *a_temp, *guess; result=buffer(10); a_temp=buffer(10); guess=buffer(10); if(checksign(a)==0 && checksign(b)==1) // (+a) / (-b) { delsign(b); result=divide(a,b); addsign(result); } else if(checksign(a)==1 && checksign(b)==0) // (-a) / (+b) { delsign(a); result=divide(a,b); addsign(result); } else if(checksign(a)==1 && checksign(b)==1) // (-a) / (-b) { delsign(a); delsign(b); result=divide(a,b); } else // (+a) / (+b) { temp=buffer(10); // void malloc... if(compare(a, b)) { *result=0; return result; } if(*b==0 && *(b+1)==10) { *result=12; return result; } point=length(a); do { point--; downward(a_temp, *(a+point)); *guess=10; do { free(temp); *guess=(*guess)-1; temp=multiple(guess, b); } while(compare(a_temp, temp)); subtemp=subtract(a_temp, temp); copy(subtemp, a_temp); plus(result, *guess, point); free(temp); free(subtemp); } while(point); } free(a_temp); free(guess); delzero(result); return result; } byte *calculate(byte *a, byte op, byte *b) { byte *result; switch(op) { case '+': result=add(a, b); break; case '-': result=subtract(a, b); break; case '*': result=multiple(a, b); break; case '/': result=divide(a, b); break; } return result; } void main() { byte a[]="123456789"; byte b[]="9"; byte *a_buffer, *b_buffer, *result; a_buffer = buffer(10); b_buffer = buffer(10); result = buffer(10); str2buf(a, a_buffer); str2buf(b, b_buffer); result = calculate(a_buffer, '*', b_buffer); print(result); printf("\n"); } |