IT_Programming/C · C++

문자열을 이용한 산술 연산 (2의 지수승 더하기)

JJun ™ 2006. 3. 6. 23:37
 

/*
*********************************************
 목표 :  2의 지수승 더하기

          (문자열을 이용한 산술 연산   )

 원리 : ASCll 코드값을 이용한 연산  
           
 기본적인 같은 두 수의 덧셈이므로          
 '5' 이상일 경우는 1을 올림해줘서 처리                 
*********************************************
*/

 

#include < stdio.h >
#include < string.h >
#include < stdlib.h >

char *GetResult(int ilimit); //실질적인 연산을 하는 함수
void mystrcpy(char *to, char *from); //구한 값을 역으로 저장하는 함수

int main(void){
 char *chp_result; //결과를 받는 변수


 //결과 받음
 chp_result = GetResult(100);
 printf("100시간일때 개체수: \n");
 puts(chp_result);
 chp_result = GetResult(250);
 printf("250시간일때 개체수: \n");
 puts(chp_result);

 return 0;
}
char *GetResult(int ilimit){

 char *chp_result; //리턴하는 결과값
 char *chp_tmp; //중간에 값이 저장되는 임시공간
 int iroof=0; //횟수를 카운트하는 변수
 int icalculate=0; //문자열의 연산을 제어하는 변수
 char *walker; //문자열내에서 이동하는 포인터
 char Upvalue = 0; //올림수

 chp_result = (char*)malloc(100);
 chp_result[0] = '1'; //원시 생물 1을 저장
 chp_result[1] = '\0'; //문자열형식을 맞추기위해 NULL저장
 chp_tmp = (char*)malloc(100);
 
 
 if(ilimit <= 0) //반복이 없다면
  return NULL; //NULL을 리턴함
 else{
  while(iroof < ilimit){
   walker = chp_result + strlen(chp_result) - 1;
   icalculate = 0;

   while(walker >= chp_result){

    if(*walker >= '5'){
     chp_tmp[icalculate] = (*walker - '0')*2 -10 + Upvalue + '0';
     chp_tmp[icalculate+1] = '\0';
     Upvalue = 1;
    }
    else{
     chp_tmp[icalculate] = (*walker - '0')*2 + Upvalue + '0';
     chp_tmp[icalculate+1] = '\0';
     Upvalue = 0; //올림수가 없으므로 0저장
    }
    walker--; 
    icalculate++; 
   }
   
   //연산이 끝나고 올림받음수가 있다면
   if(Upvalue == 1){ 
    chp_tmp[icalculate] = '1';
    chp_tmp[icalculate+1] = '\0';
    Upvalue = 0;
   }

   mystrcpy(chp_result, chp_tmp);
   iroof++;
  }
 }

 return chp_result;
}


/*
tmp에 저장되는것은 거꾸로 저장된다.
즉 8+8 이 61로 저장된다.
그러므로 result에는 거꾸로 저장해야하므로
strcpy를 새로 작성하였다.
*/
void mystrcpy(char *to, char *from){
 char *p;
 
 p = from + strlen(from)-1;

 while(p >= from){
  *to++ = *p--;
  
 }
 *to = '\0';
}