Date: 2020/10/22
Title: hw6_5_plus
Author: bearbenbin
Task:
- To get a correct answer of addition of two overlong integers by simulating vertical addition.
Rules:
- The method of calculation should be simulation of vertical addition.
- All overlong integers including the result should be saved in an array of strings.
Result:
num0 = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+
num1 = -1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
=
result = 0
num0 = 1000
+
num1 = -1
=
result = 999
num0 = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+
num1 = 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
=
result = 2469135780246913578024691357802469135780246913578024691357802469135780246913578024691357802469135780
Idea:
Code:
#include<iostream.h>
#include<string.h>
#define SIZE 103
int check(char *);
int preprocess(char *, char *);
void rightArrange(char *, char *);
int compare(char *, char *);
void calculating(char *, char *, char *);
int main(){
char num[3][SIZE]={0}, *num0=num[0], *num1=num[1], *result=num[2];
do{
strcpy(num0,"");
strcpy(num1,"");
cout<<"num0 = ";
cin>>num0;
cout<<'+'<<endl<<"num1 = ";
cin>>num1;
}while( check(num0) || check(num1) );
calculating(num0, num1, result);
cout<<'='<<endl<<"result = "<<result<<endl;
return 0;
}
int check(char *num){
int fault=0;
( (*num=='0' && *(num+1)!=0) || ((*num<'0' || *num>'9') && *num!='-') || (*num=='-' && *(num+101)!=0) || (*num!='-' && *(num+100)!=0) )? fault=1 : (void)1;
for(int i=1; *(num+i)!=0; i++){
( *(num+i)<'0' || *(num+i)>'9' )? fault=1 : (void)1;
}
return fault;
}
int preprocess(char *num0, char *num1){
int rule=0;
char temp[SIZE]={0};
if(*num0=='-'){
strcpy(temp, (num0+1));
strcpy(num0, temp);
rule=3;
if(*num1=='-'){
rule=1;
strcpy(temp, (num1+1));
strcpy(num1, temp);
}
}
else
(*num1=='-')? (rule=2, strcpy(temp, (num1+1)), strcpy(num1, temp)) : (void)1;
int delta=strlen(num0)-strlen(num1);
(delta != 0)? ( (delta>0)? (rightArrange(num0, num1)) : (rightArrange(num1, num0)) ) : (void)1;
(compare(num0, num1) && rule>1)? (rule==2? rule=3 : rule=2) : (void)1;
return rule;
}
void rightArrange(char *num0, char *num1){
char temp[SIZE]={0};
for(unsigned int i=0; i<strlen(num0)-strlen(num1); i++){
strcat(temp,"0");
}
strcat(temp, num1);
strcpy(num1, temp);
}
int compare(char *num0, char *num1){
int bigBro=0, len0=strlen(num0), len1=strlen(num1);
if( len0==len1 && strcmp(num0,num1)<0 ){
bigBro=1;
char temp[SIZE]={0};
strcpy(temp, num0);
strcpy(num0, num1);
strcpy(num1, temp);
}
return bigBro;
}
void calculating(char *num0, char *num1, char *result){
int sum, add, a, b, c, d, rule=preprocess(num0, num1);
strrev(num0);
strrev(num1);
(rule==0 || rule==1)? (a=d=1, b=c=0, add=0) : (a=c=-1, b=10, d=0, add=0);
for(unsigned int i=0, e=1; i<strlen(num0)+e; i++){
(i==strlen(num0))? sum=add : sum=(num0[i]-'0')+a*(num1[i]-'0')+b+add;
sum>=10? ( add=d, result[i]=sum-10+'0', ((rule==0 || rule==1)? e=1 : e=0) ) : ( add=c, result[i]=sum+'0', e=0 );
}
while( *(result+strlen(result)-1)=='0' && *(result+strlen(result)-2)!=0 ){
*(result+strlen(result)-1)=0;
}
((rule==1 || rule== 3) && *(result+strlen(result)-1)!='0')? (strcat(result, "-"), strrev(result)) : strrev(result);
}