-_-; 사실은 깝싼이유는...
별것도 아닌 문제겠지만.. 나한테는 꽤나 힘들었다는..
그래서 우월감? 이런 쓸대 없는 감정 없에게 그랬던거 였어 ㅋ
너네가 당근이 코드는 더 잘짜겠지... 그거보고 배우기도 하고 ㅋ
*/
#include<stdio.h>
#include<string.h>
#define CHARINT(x) x - 48
#define INTCHAR(x) x + 48
#define MAX(x,y) x > y ? x : y
enum { NO_MORE = 0 , MORE , ERROR , NULLSPACE = 1};
int check(char*,char*,int,int);
char* sum(char*,char*,char*,int,int,int,int);
int main()
{
char l[] = \"9245245234524352345234999\";
char r[] = \"1115234523452345234523452\";
char* t = NULL;
int bCheck = MORE;
int size = 0;
int l_len = strlen(l);
int r_len = strlen(r);
bCheck = check(l,r,l_len - 1,r_len - 1);
printf(\"you need %s memory!\\n\",bCheck == MORE ? \"more\" : \"no_more\"); // Testing printf !
t = (char*)malloc(size = bCheck + (MAX(l_len,r_len)) + NULLSPACE);
printf(\"total memory size is %d\\n\",size);
t[--size] = \'\\0\';
printf(\"%s + %s = %s\\n\",l,r,sum(l,r,t,l_len - 1,r_len - 1,size -1,bCheck));
free(t);
return 0;
}
char* sum(char* l ,char* r,char* t,int l_len,int r_len,int t_len,int bCheck) // size is total\'s size
{
int result = 0;
int over = 0;
int i = 0;
int idx = 0;
if ( l_len > r_len ) {
while( t_len ) {
result = CHARINT(l[l_len]) + CHARINT(r[r_len]) + over;
if ( result < 10 && r_len > 0 ) { //더하는中 10보다 작을때.
t[t_len] = INTCHAR(result);
}
else if ( result >= 10 && r_len > 0 ) {// 더하는中 10보다 클때
over = 1; result -= 10;
t[t_len] = INTCHAR(result);
}
else if ( result < 10 && r_len == 0 ) { // 더했는데 10작을때
t[t_len] = INTCHAR(result);
for ( i = t_len - 1 ; i >= 0 ; i-- ) t[i] = l[i];
break;
}
else if ( result >= 10 && r_len == 0 ) { // 더했는데 10보다 클때
result -= 10;
over = 1;
t[t_len] = INTCHAR(result);
for ( i = t_len - 1 ; i >= 0 ; i-- ) {
result = CHARINT(l[i]) + over;
if ( result < 10 ) {
over = 0;
t[i] = INTCHAR(result);
}
else if ( result >= 10 ) {
over = 1; result -= 10;
t[i] = INTCHAR(result);
}
}
if ( bCheck == MORE ) t[0] = INTCHAR(over);
break;
}
t_len--;
r_len--;
l_len--;
}
}
else if ( l_len == r_len ) {
idx = l_len;
while ( idx >= 0 ) {
result = CHARINT(l[idx]) + CHARINT(r[idx]) + over;
if ( result < 10 && idx >= 0 ) {
t[t_len] = INTCHAR(result);
}
else if ( result >= 10 && idx >= 0 ) {
over = 1; result -= 10;
t[t_len] = INTCHAR(result);
}
t_len--;
idx--;
}
if ( bCheck == MORE ) t[0] = INTCHAR(over);
}
return t;
}
int check(char* l, char* r,int l_len, int r_len)
{
int i = 0;
int result = 0;
int over = 0; // 변수 : over는 같은 자릿수 계산에 이용.
int more_long = 0;
int more_short = 0;
int same_len = 0;
if ( l_len > r_len ) { // 한쪽이 더 긴경우.
more_long = l_len;
more_short = r_len;
while ( more_long ) {
result = CHARINT(l[more_long]) + CHARINT(r[more_short]);
if ( result < 10 && more_short == 0 ){ // 다 더했는데 10보다 작을때.
return NO_MORE;
}
else if ( result >= 10 && more_short == 0 ){ // 다 더했는데 10보다 클때.
if ( more_long == more_short ) return MORE;
if ( CHARINT(l[more_long - 1]) < 9 ){ // 더 긴수의 담자리가 9보다 작을때..
return NO_MORE;
}
else { // 9이면.
for ( i = more_long - 1 ; i >= 0 ; i-- ){
result = CHARINT(l[i]) + 1;
if ( result >= 10 && i == 0 ){
return MORE;
}
if ( result < 10 ) {
return NO_MORE;
}
}
}
}
more_long--;
more_short--;
}
}
else if ( l_len == r_len ) {
same_len = l_len + 1;
while(same_len--){
result = CHARINT(l[same_len]) + CHARINT(r[same_len]) + over;
over = (result >= 10 ? 1 : 0);
result = ( over == 1 ? result -= 10 : result );
if ( same_len == 0 && over == 1 ) return MORE;
else if ( same_len == 0 && over == 0 ) return NO_MORE;
if ( CHARINT(l[same_len - 1]) + CHARINT(r[same_len-1]) < 9 ) over = 0;
}
}
return ERROR;
}
고객님이렇게아무데나싸질러놓으시면안됩니다.
잘 짰삼
수고하셨습니다.
-_-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 이게 아닌데;
잘싸시네요
-_-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 이게 아닌데;
-_-?
-_-!!
잘 하셨어요