#include <iostream> using namespace std; void ReverseStr(char *result) { int len=strlen(result); char *end=result+len-1; char *start=result; while (end>=start) { char temp=*end; *end=*start; *start=temp; end--; start++; } } ///两整数相加 void TwoPositiveAdd(const char* num1,const char *num2,char *result) { int len1=strlen(num1); int len2=strlen(num2); const char *p1=num1+len1-1; const char *p2=num2+len2-1; char *temp=result; int carry=0; //进位 int curR=0; while (p1>=num1 && p2>=num2) { curR=(*p1-'0')+(*p2-'0')+carry; carry=curR/10; *temp=curR%10+'0'; p1--; p2--; temp++; } while (p1>=num1) { curR=(*p1-'0')+carry; carry=curR/10; *temp=curR%10+'0'; p1--; temp++; } while (p2>=num2) { curR=(*p2-'0')+carry; carry=curR/10; *temp=curR%10+'0'; p2--; temp++; } while (carry!=0) { *temp=carry+'0'; carry=carry/10; temp++; } *temp='/0'; ReverseStr(result); } ///两整数相减 void TwoPositiveSub(const char* num1,const char *num2,char *result) { int len1=strlen(num1); int len2=strlen(num2); const char *p1=num1+len1-1; const char *p2=num2+len2-1; int borrow=0; //借位 int cur=0; char *temp=result; if (strcmp(num1,num2)<0 && strlen(num1)<=strlen(num2)) { const char *p1=num2+len2-1; const char *p2=num1+len1-1; while (p1>=num2 && p2>=num1) { if ((*p1-(borrow+'0')+'0')< *p2) { cur=(*p1-'0')-(*p2-'0')+10-borrow; *temp=cur+'0'; borrow=1; if (p1==num2 &&p2==num1 &&*temp=='0') { *temp='-'; temp++; *temp='/0'; return; } p1--; p2--; temp++; } else { cur=(*p1-'0')-(*p2-'0')-borrow; *temp=cur+'0'; borrow=0; if (p1==num2 &&p2==num1 &&*temp=='0') { *temp='-'; temp++; *temp='/0'; return; } p1--; p2--; temp++; } } while (p1>=num2) { if (*p1-'0'-borrow<0) { cur=(*p1-'0')-borrow+10; *temp=cur+'0'; borrow=1; temp++; p1--; } else { cur=(*p1-'0')-borrow; *temp=cur+'0'; borrow=0; if (p1==num2 && cur==0) { *temp='-'; temp++; *temp='/0'; return; } temp++; p1--; } } *temp='-'; temp++; *temp='/0'; } else { while (p1>=num1 && p2>=num2) { if ((*p1-(borrow+'0')+'0')< *p2) { cur=(*p1-'0')-(*p2-'0')+10-borrow; *temp=cur+'0'; borrow=1; p1--; p2--; temp++; } else { cur=(*p1-'0')-(*p2-'0')-borrow; *temp=cur+'0'; borrow=0; p1--; p2--; temp++; } } while (p1>=num1) { if (*p1-'0'-borrow<0) { cur=(*p1-'0')-borrow+10; *temp=cur+'0'; borrow=1; temp++; p1--; } else { cur=(*p1-'0')-borrow; *temp=cur+'0'; borrow=0; if (p1==num1 && cur==0) { *temp='/0'; return; } temp++; p1--; } } *temp='/0'; } ReverseStr(result); } bool IsValid(const char *num) { if (num==NULL) { return false; } const char *temp=num; if (*temp=='+') { return false; } if (*temp=='-') temp++; while (*temp!='/0') { if (*temp<'0' || *temp>'9') { return false; } temp++; } return true; } void ArbitraryAdd(const char* num1,const char *num2,char *result) { if (!IsValid(num1) || !IsValid(num2)) { cout<<"You input illegal number!"<<endl; return; } const char* p1=NULL; const char* p2=NULL; char *temp=result; if (*num1!='-' &&*num2!='-') { TwoPositiveAdd(num1,num2,temp); return; } else if (*num1=='-' &&*num2=='-') { p1=++num1; p2=++num2; *temp='-'; temp++; TwoPositiveAdd(num1,num2,temp); return; } else { if (*num1!='-' &&*num2=='-') { p1=num1; p2=++num2; TwoPositiveSub(p1,p2,temp); return; } else { p1=++num1; p2=num2; TwoPositiveSub(p2,p1,temp); return; } } } int main() { char *num1="3121"; char *num2="-1121"; if (strcmp(num1,num2)<0 &&strlen(num1)<=strlen(num2)) { cout<<"litter"<<endl; } else cout<<"larger"<<endl; int len=strlen(num1)>=strlen(num2)?strlen(num1):strlen(num2); // char *result1=new char[len+2]; // TwoPositiveAdd(num1,num2,result1); // cout<<result1<<endl; // delete []result1; // char *result2=new char[len+2]; // TwoPositiveSub(num1,num2,result2); // cout<<result2<<endl; // delete []result2; char *result=new char[len+2]; ArbitraryAdd(num1,num2,result); cout<<result<<endl; return 0; }