문자열을 이용한 산술 연산 (2의 지수승 더하기)
/*
*********************************************
목표
: 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';
}