#include <iostream>
using namespace std;
#define NUM1_ADD_NUM2 ((num1[loc1]-'0')+(num2[loc2]-'0'))
#define NUM1 (num1[loc1]-'0')
#define NUM2 (num2[loc2]-'0')
void add(const char *num1, const char *num2, char *result)
{
char rev_result[100]= {0};
char len1, len2, loc1, loc2, loc3;
char flag1, flag2, carry;
char bigger;
const char *p_num;
int mid_num;
int i, j;
flag1 = num1[0];
flag2 = num2[0];
if(flag1 == '-' && flag2 != '-') //if(- +)
{
p_num = num1;
num1 = num2;
num2 = p_num;
flag1 = num1[0];
flag2 = num2[0];
}
len1 = strlen(num1);
len2 = strlen(num2);
loc1 = len1 - 1;
loc2 = len2 - 1;
loc3 = 0;
if(flag1 != '-' && flag2 != '-') // if(++).
{
carry = 0;
for( ; loc1 >=0 &&loc2 >=0; --loc1, --loc2)
{
mid_num = (NUM1_ADD_NUM2+carry);
rev_result[ loc3++ ] = mid_num % 10 + '0';
carry = mid_num / 10 ;
}
if(loc1 < loc2)
{
for( ; loc2 >=0; --loc2)
{
mid_num = num2[loc2] - '0' + carry;
rev_result[loc3++] = mid_num % 10 + '0';
carry = mid_num / 10;
}/* for */
}// if(loc1<loc2).
else if(loc1 > loc2)
{
for(; loc1 >= 0; --loc1)
{
mid_num = num1[loc1] - '0' + carry;
rev_result[loc3++] = mid_num % 10 + '0';
carry = mid_num / 10;
}/* for */
}//else if(loc1>loc2).
if(carry)
rev_result[loc3++] = '1';
}//if( a+b).
else if( flag1 =='-' &&flag2 == '-')
{
carry = 0;
for( ; loc1 >=1 &&loc2 >=1; --loc1, --loc2)
{
mid_num = (NUM1_ADD_NUM2+carry);
rev_result[ loc3++ ] = mid_num % 10 + '0';
carry = mid_num / 10 ;
}
if(loc1 < loc2)
{
for( ; loc2 >=1; --loc2)
{
mid_num = num2[loc2] - '0' + carry;
rev_result[loc3++] = mid_num % 10 + '0';
carry = mid_num / 10;
}/* for */
}// if(loc1<loc2).
else if(loc1 > loc2)
{
for(; loc1 >= 1; --loc1)
{
mid_num = num1[loc1] - '0' + carry;
rev_result[loc3++] = mid_num % 10 + '0';
carry = mid_num / 10;
}/* for */
}//else if(loc1>loc2).
if(carry)
rev_result[loc3++] = '1';
rev_result[loc3++] = '-';
}//if (-a+-b).
else if( flag1 !='-' && flag2 == '-')
{
/* judge which number's absolute value is bigger.*/
if( len1 > len2 -1) bigger =1;
else if(len1 == len2-1)
{
for(i=0, j=1; i<len1 && j<len2 && num1[i] == num2[j]; ++i, ++j)
{ ; }
if( i == len1) bigger =0;
else if( num1[i] > num2[j]) bigger = 1;
else bigger = 2;
}
else
bigger = 2;
/* judge which number's absolute value is bigger.*/
/* calculate the result of addition*/
if(0 == bigger) rev_result[loc3++] = '0';
else if( 1 == bigger)
{
carry = 0;
for( ; loc2>=1 && loc1 >=0; --loc1, --loc2)
{
mid_num = NUM1 - NUM2 + carry;
carry = 0;
if( mid_num <0) //such as 321 - 123.
{
carry = -1;
mid_num +=10;
}
rev_result[loc3++] = mid_num + '0';
}
for( ; loc1>=0; --loc1)
{
mid_num = NUM1 + carry;
carry = 0;
if(mid_num < 0)
{
carry = -1;
mid_num += 10;
}
rev_result[loc3++] = mid_num + '0';
}
// to delete the '0' such as '10000'
while( rev_result[--loc3] == '0')
rev_result[loc3] = 0;
++loc3;
}
else //bigger ==2.
{
carry = 0;
for( ; loc2 >=1 && loc1 >=0; --loc1, --loc2)
{
mid_num = NUM2 - NUM1 + carry;
carry = 0;
if(mid_num < 0)
{
carry = -1;
mid_num += 10;
}
rev_result[loc3++] = mid_num + '0';
}
for( ; loc2>=1; --loc2)
{
mid_num = NUM2 + carry;
carry = 0;
if(mid_num < 0)
{
carry = -1;
mid_num += 10;
}
rev_result[loc3++] = mid_num + '0';
}
while(rev_result[--loc3] == '0')
rev_result[loc3] = 0;
rev_result[++loc3] = '-';
++loc3;
}
/* calculate the result of addition*/
}//else if( a+ -b).
for( i=0; i < loc3; ++i)
{
result[i] = rev_result[loc3 - 1 - i];
} // to reverse the rev_result to result.
}
int main()
{
char num1[100], num2[100] , result[100]={0};
cout<<"input num1"<<ends;
cin>>num1;
cout<<"input num2"<<ends;
cin>>num2;
add(num1, num2, result);
cout<<"result_str: "<<result<<endl;
return 0;
}
评论0
最新资源